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