Saya membuat middleware WSGI yang menyimpan bahan mentah dari environ['wsgi.input']
sungai. Saya menyimpan nilai di lingkungan WSGI sehingga saya bisa mengaksesnya dari request.environ['body_copy']
dalam aplikasi saya.
Ini tidak diperlukan di Werkzeug atau Flask, karena request.get_data()
akan mendapatkan data mentah terlepas dari jenis konten, tetapi dengan penanganan yang lebih baik dari perilaku HTTP dan WSGI.
Ini membaca seluruh tubuh ke dalam memori, yang akan menjadi masalah jika misalnya file besar diposting. Ini tidak akan membaca apa pun jika Content-Length
tajuk tidak ada, sehingga tidak akan menangani permintaan streaming.
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']