Stworzyłem oprogramowanie pośredniczące WSGI, które przechowuje surowe treści ze environ['wsgi.input']
strumienia. Zapisałem wartość w środowisku WSGI, aby mieć do niej dostęp z request.environ['body_copy']
poziomu mojej aplikacji.
Nie jest to konieczne w Werkzeug lub Flask, ponieważ request.get_data()
spowoduje to pobranie surowych danych niezależnie od typu zawartości, ale z lepszą obsługą zachowania HTTP i WSGI.
Powoduje to wczytanie całego ciała do pamięci, co będzie problemem, jeśli na przykład opublikowany zostanie duży plik. Nie odczyta niczego, jeśli Content-Length
brakuje nagłówka, więc nie obsługuje żądań przesyłania strumieniowego.
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
environ['wsgi.input'] = BytesIO(body)
return self.application(environ, start_response)
app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']