Creé un middleware WSGI que almacena el cuerpo sin procesar de la environ['wsgi.input']
secuencia. Guardé el valor en el entorno WSGI para poder acceder a él desderequest.environ['body_copy']
mi aplicación.
Esto no es necesario en Werkzeug o Flask, ya request.get_data()
que obtendrá los datos en bruto independientemente del tipo de contenido, pero con un mejor manejo del comportamiento HTTP y WSGI.
Esto lee todo el cuerpo en la memoria, lo que será un problema si, por ejemplo, se publica un archivo grande. Esto no leerá nada si Content-Length
falta el encabezado, por lo que no manejará las solicitudes de transmisió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']