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