153

以前、空だったので、Flaskリクエストで受信したデータを取得する方法を尋ねました。request.data答えは、それrequest.dataが生の投稿本文であると説明しましたが、フォームデータが解析されると空になります。生のポストボディを無条件に取得す​​るにはどうすればよいですか?

@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data
4

4 に答える 4

252

request.get_data()コンテンツ タイプに関係なく、生データを取得するために使用します。request.dataデータはキャッシュされ、その後、request.json、 、に自由にアクセスできますrequest.form

最初にアクセスすると、最初にフォーム データを解析するための引数を指定してrequest.data呼び出します。get_dataリクエストにフォーム コンテンツ タイプ ( multipart/form-dataapplication/x-www-form-urlencoded、またはapplication/x-url-encoded) がある場合、生データが消費されます。この場合は空に見えますrequest.datarequest.json

于 2014-05-27T21:06:57.973 に答える
41

request.streamWSGI サーバーによってアプリケーションに渡される生データのストリームです。通常は代わりに必要ですが、それを読み取るときに解析は行われませんrequest.get_data()

data = request.stream.read()

request.dataまたは別の属性によって以前に読み取られた場合、ストリームは空になります。

于 2012-06-12T16:25:25.097 に答える
18

environ['wsgi.input']ストリームから生の本体を格納する WSGI ミドルウェアを作成しました。値を WSGI 環境に保存してrequest.environ['body_copy']、アプリ内からアクセスできるようにしました。

Werkzeug や Flask では、request.get_data()コンテンツ タイプに関係なく生データを取得するため、これは必要ありませんが、HTTP および WSGI の動作をより適切に処理できます。

これにより、本文全体がメモリに読み込まれます。これは、たとえば大きなファイルが投稿された場​​合に問題になります。ヘッダーが欠落している場合、これは何も読み取らないContent-Lengthため、ストリーミング リクエストは処理されません。

from io import BytesIO

class WSGICopyBody(object):
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        length = int(environ.get('CONTENT_LENGTH') or 0)
        body = environ['wsgi.input'].read(length)
        environ['body_copy'] = body
        # replace the stream since it was exhausted by read()
        environ['wsgi.input'] = BytesIO(body)
        return self.application(environ, start_response)

app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']
于 2012-06-22T20:29:43.267 に答える
8

request.dataがフォーム データとして認識された場合、 は空になりrequest.headers["Content-Type"]、 に解析されrequest.formます。コンテンツ タイプに関係なく生データを取得するには、 を使用しますrequest.get_data()

request.dataを呼び出しますrequest.get_data(parse_form_data=True)。これにより、フォーム データの動作が異なります。

于 2014-10-28T21:20:00.283 に答える