蔦箱(蔦箱)

Python(WSGI)でGET、POSTを処理する方法.

FieldStorageクラスを使った処理



ネット上ではPythonのcgi.parse_qsl関数を使用したリクエストの処理がよく紹介されていますが、その手法は古いため処理できないリクエストがあります。

たとえば、POSTの中にバイナリーのデータが交じる場合(ファイルアップロード時など)はPOSTを"multipart/form-data"にする必要がありますが、このタイプの構文をcgi.parse_qslで正常に処理することはできません。
現在は標準ライブラリのFieldStorageクラスを利用するのが一番良いです(FieldStorageもcgiの中にありますが別の体系の機能です)。

GETを処理するプログラム

# -*- coding: utf-8 -*-
import cgi
def application(environ, start_response):
#environ リクエストのデータが格納されている。
#start_response 呼び出し元にページのヘッダ情報を返却するために使用する(最終的にブラウザに送られる)

htmltext = "<h1>GET result</h1>"
if 'GET'==environ.get('REQUEST_METHOD'):
#リクエストを辞書状にする処理
form = cgi.FieldStorage(environ=environ,keep_blank_values=True)
for key in form:
htmltext+="key:"+key+" value:"+form[key].value+"<br>"
#ステータスコードと、コンテンツのMIMEを指定
start_response("200 OK",[('Content-Type','text/html')])
return htmltext

#Apacheが無いとき用のサーバー このファイルを実行するとWebサーバーになる
from wsgiref import simple_server
if __name__ == '__main__':
server = simple_server.make_server('', 8080, application)
server.serve_forever()
FieldStrageのインスタンスは辞書のようにアクセスできるものの、値がminiFieldStorageに格納されている点に注意(form["key"].valueのようにアクセスする必要がある)
environ.get('QUERY_STRING')を行うとリクエストのテキストをそのまま受け取ることができます。

POSTを処理するプログラム

# -*- coding: utf-8 -*-
import cgi
def application(environ, start_response):
#environ リクエストのデータが格納されている。
#start_response 呼び出し元にページのヘッダ情報を返却するために使用する(最終的にブラウザに送られる)

htmltext = "<h1>POST result</h1>"
if 'POST'==environ.get('REQUEST_METHOD'):

wsgi_input = environ['wsgi.input']
#リクエストをリスト状にする処理
form = cgi.FieldStorage(fp=wsgi_input,environ=environ,keep_blank_values=True)
for key in form:
htmltext+="name:"+key+" value:"+form[key].value+"<br>"
#ステータスコードと、コンテンツのMIMEを指定
start_response("200 OK",[('Content-Type','text/html')])
return htmltext

#Apacheが無いとき用のサーバー
from wsgiref import simple_server
if __name__ == '__main__':
server = simple_server.make_server('', 8080, application)
server.serve_forever()
POSTメッセージはHTTPリクエストのボディ部分に格納されます。なのでenviron['wsgi.input']でボディ部にアクセスするハンドル(ファイルハンドル風)を手に入れます。
environ['wsgi.input'].read()を行うとボディ部のデータを見ることができます。
ファイルをアップロードした場合ファイルハンドルを受け取ることができます(複数ファイルアップロードの場合はリストが帰ってくる)。


参考文献
Python公式ドキュメントの説明(FieldStorageの詳細な説明がない?)
FieldStorageクラスのメンバについての情報(説明が無い)
environで使用できるキーの説明(environ[]かenviron.get()で使用することができる)(WSGI.org)
HTTPリクエストの中身について - YoheiM.NET



-サイトのコンテンツ-


記事
記事とか書きます.
新記事
新しい記事.
蔦箱(ツタハコ)
トップページ
作成物
作成した物とか置きます.
その他
適当


連絡先: