PythonのCGIでGETやPOSTの値を受け取ってみる

はじめに

こんにちは、野村です。

今回は、PythonでCGIを組む方法を紹介します。

これで、Pythonならではのライブラリを使ったプログラムをWebに公開できます。
でも、いまどきCGIを書くこと自体のメリットはあるのかな?

スクリプト

GETやPOSTで送信した値を書き出すスクリプトです。
GETもPOSTも「getvalue」というメソッドで取り出せるようです。

Python2系と3系では書き方が違うので両方掲載しておきます。
拡張子は「.cgi」。サーバにアップしたら属性を755に設定するのを忘れずに。

Python2系の場合

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import sys
import codecs
sys.path.append('/home/xxx/pylib') #モジュールを格納するデレクトリのパス
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
print("Content-type: text/html; charset=UTF-8\n")

import cgi
form = cgi.FieldStorage()

htm = '''<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>py2.cgi</title>
</head>
<body>
<form method="POST">
<input type="text" name="ptest"/>
<input type="submit"/>
</form>
<div>%s</div>
</body>
</html>
'''

print(htm % form.getvalue('ptest'))

Python3系の場合

#!/usr/local/bin/python3
import sys 
import io
sys.path.append('/home/xxx/pylib') #モジュールを格納するデレクトリのパス
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print("Content-type: text/html; charset=UTF-8\n")

import cgi
form = cgi.FieldStorage()

htm = '''<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>py3.cgi</title>
</head>
<body>
<form method="POST">
<input type="text" name="ptest"/>
<input type="submit"/>
</form>
<div>%s</div>
</body>
</html>
'''

print(htm % form.getvalue('ptest'))

GETとPOSTに両方送信すると

GETもPOSTも同じメソッドから取り出せる。
ならば、同じ名前のパラメータに同時に送信するとどうなるんだろ?
ちょっと実験してみました。

GET側に「GetVal」、POST側に「PostVal」という文字列を設定して送信してみると

['PostVal', 'GetVal']

配列で返ってきた。あ、Pythonだから「リスト」と呼ぶのか。
そして、POSTが優先なのですな。

終わりに

以上、PythonでCGIを書く方法を紹介しました。

ちょっとしたものをWebに公開するにはいいかもしれないです。

というわけで、今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。