9

WSGIでは、投稿データはファイルのようなオブジェクトを読み取ることによって消費されますenviron['wsgi.input']。スタック内の2番目の要素もポストデータを読み取りたい場合は、読み取るものがなくなったときに読み取ることでプログラムをハングさせる可能性があります。

POSTデータをコピーして、複数回処理できるようにするにはどうすればよいですか?

4

3 に答える 3

12

ストリームのファイルのようなレプリカを環境に戻すことを試みることができます。

from cStringIO import StringIO

length = int(environ.get('CONTENT_LENGTH', '0'))
body = StringIO(environ['wsgi.input'].read(length))
environ['wsgi.input'] = body

ただし、これを行う必要があるのは少し臭いです。理想的には、1つのコードのみがクエリ文字列と投稿本文を解析し、結果を他のコンポーネントに配信する必要があります。

于 2009-11-23T14:32:05.917 に答える
8

WebObパッケージを見てください。wsgi.input をシーク可能にするように指定できる機能を提供します。これには、入力ストリームを巻き戻して、コンテンツを別のハンドラーで再生できるようにする効果があります。WebOb を使用していない場合でも、Ian が適切な方法でこれを行ったと信頼できるように、これを行う方法は有益なはずです。ドキュメント内の検索結果については、こちらを参照してください

于 2009-11-23T22:18:43.417 に答える
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の投稿はかなり脆弱だと思います...

于 2009-11-23T14:31:32.830 に答える