PythonCGIにおけるリクエスト処理となります。 WSGIによるリクエストの取得方法はリクエストの取得 (WSGI)をご覧ください。
POST / GET
基本的にPOSTでもGETでも取得方法に相違はありません。たとえばPOSTのみを処理対象としたい場合などはos.environ[‘REQUEST_METHOD’]へPOSTもしくはGETが文字列で格納されているため、それを元に判断することができます。
import cgi
import os
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# HTML文字列
html = '''
<!DOCTYPE html>
<html>
<head>
<title>CGI</title>
<meta charset="UTF-8">
</head>
<body>
{}
<hr>
{}
<hr>
{}
</body>
</html>
'''
# フォームから値を取得
name = '未入力'
email = '未入力'
errors = []
form = cgi.FieldStorage()
if 'name' in form:
name = form['name'].value
else:
errors.append('お名前の入力がありません。')
if 'email' in form:
email = form['email'].value
else:
errors.append('メールアドレスの入力がありません。')
result = 'お名前:{}<br />'.format(name)
result += 'メールアドレス: {}'.format(email)
# 結果を表示
print(html.format(
'リクエストは {} です。'.format(os.environ['REQUEST_METHOD']),
result,
'<br />'.join(errors))
)
CGIは標準出力(上記例ではprint)で結果を出力します。7行目の記述は文字化け対策で、printで日本語を出力しない場合は不要です(Python 2系でも不要です)。cgiモジュールのFieldStrageでパラメータを取得し、値の有無をチェックしたあとに35行目、40行目で取得しています。
テストサーバーでの動作確認
先の例をmain.pyとして保存し、次のようなディレクトリ階層で配置するものとします。
※簡易テストサーバーについてはCGI – テストサーバーの起動を参照してください。
- c:
- python
- cgi-bin
- main.py
次のコマンドを入力し、まずはc:/pythonへ移動します。
cd c:/python
次に簡易テストサーバーを起動します。
python -m http.server --cgi
待ち受け状態となったらウェブブラウザを開き次のURLを入力してください。あとに続く画像がウェブブラウザでの表示例です。

入力値を取得できなかったので、お名前やメールアドレスが未入力となっているはずです。先の例はGETも許容しているので次のようなURLを入力してみましょう。

GETで値を取得できたので、その入力値が表示されます。また「〇〇の入力がありません。」というエラーメッセージがなくなっています。
