environ['wsgi.input']
Akıştan ham gövdeyi depolayan bir WSGI ara yazılımı oluşturdum . Değeri WSGI ortamında kaydettim, böylece request.environ['body_copy']
uygulamamdan ona erişebildim .
Bu, request.get_data()
içerik türüne bakılmaksızın ham verileri alacağı için Werkzeug veya Flask'ta gerekli değildir , ancak HTTP ve WSGI davranışının daha iyi işlenmesiyle.
Bu, tüm gövdeyi belleğe okur ve bu, örneğin büyük bir dosya gönderildiğinde sorun olur. Bu, Content-Length
başlık eksikse hiçbir şey okumaz , bu nedenle akış isteklerini işlemez.
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']