Я створив проміжне програмне забезпечення 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']