我创建了一个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']