Tôi đã tạo một phần mềm trung gian WSGI lưu trữ phần thô từ environ['wsgi.input']
luồng. Tôi đã lưu giá trị trong môi trường WSGI để tôi có thể truy cập nó từ request.environ['body_copy']
trong ứng dụng của mình.
Điều này không cần thiết trong Werkzeug hoặc Flask, vì request.get_data()
sẽ nhận được dữ liệu thô bất kể loại nội dung, nhưng với việc xử lý tốt hơn hành vi HTTP và WSGI.
Điều này đọc toàn bộ cơ thể vào bộ nhớ, đây sẽ là một vấn đề nếu ví dụ một tập tin lớn được đăng. Điều này sẽ không đọc bất cứ điều gì nếu Content-Length
tiêu đề bị thiếu, vì vậy nó sẽ không xử lý các yêu cầu phát trực tuyến.
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']