Acabo de tener este problema, y creo que algunos de ustedes podrían beneficiarse de mi solución. Creé una clase de middleware de WSGI que guarda el cuerpo de POST en bruto del socket. Guardé el valor en la variable WSGI 'environ' para poder referirme a él como request.environ ['body_copy'] dentro de mi aplicación Flask.
Debe tener cuidado de que los datos de la publicación no sean demasiado grandes o de que haya problemas de memoria en su servidor.
class WSGICopyBody(object):
def __init__(self, application):
self.application = application
def __call__(self, environ, start_response):
from cStringIO import StringIO
length = environ.get('CONTENT_LENGTH', '0')
length = 0 if length == '' else int(length)
body = environ['wsgi.input'].read(length)
environ['body_copy'] = body
environ['wsgi.input'] = StringIO(body)
# Call the wrapped application
app_iter = self.application(environ,
self._sr_callback(start_response))
# Return modified response
return app_iter
def _sr_callback(self, start_response):
def callback(status, headers, exc_info=None):
# Call upstream start_response
start_response(status, headers, exc_info)
return callback
app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy'] # This is the raw post body you can use in your flask app
Este es probablemente un detalle de implementación de werkzeug, el micro-framework subyacente de WSGI, y no Flask. – jathanism