environ['wsgi.input']
ストリームからの未加工のボディを格納するWSGIミドルウェアを作成しました。request.environ['body_copy']
アプリ内からアクセスできるように、値をWSGI環境に保存しました。
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']