Я создал промежуточное программное обеспечение WSGI, в котором хранится необработанное тело из environ['wsgi.input']
потока. Я сохранил значение в среде 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']