WSGIでは、投稿データはファイルのようなオブジェクトを読み取ることによって消費されますenviron['wsgi.input']
。スタック内の2番目の要素もポストデータを読み取りたい場合は、読み取るものがなくなったときに読み取ることでプログラムをハングさせる可能性があります。
POSTデータをコピーして、複数回処理できるようにするにはどうすればよいですか?
ストリームのファイルのようなレプリカを環境に戻すことを試みることができます。
from cStringIO import StringIO
length = int(environ.get('CONTENT_LENGTH', '0'))
body = StringIO(environ['wsgi.input'].read(length))
environ['wsgi.input'] = body
ただし、これを行う必要があるのは少し臭いです。理想的には、1つのコードのみがクエリ文字列と投稿本文を解析し、結果を他のコンポーネントに配信する必要があります。
一挙に読む場合は、いつでも読み込んで、読んだもののCStringIOファイルのようなオブジェクトを作成し、次のように割り当てることができます。
import cStringIO
import copy
lines = []
for line in environ['wsgi.input']:
lines.append(line)
newlines = copy.copy(lines)
environ['wsgi.input'] = cStringIO.StringIO(''.join(newlines))
これを行うにはおそらくもっと効率的な方法がありますが、一般的に、重要なこと(投稿データの複数回の読み取りなど)を実行したい場合は、wsgiの投稿はかなり脆弱だと思います...