リクエストの取得 (CGI)

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を入力してください。あとに続く画像がウェブブラウザでの表示例です。

http://localhost:8000/cgi-bin/main.py


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

http://localhost:8000/cgi-bin/main.py?name=test_user&email=test_user@example.com

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