python - meaning - flask wikipedia
Obtiene el cuerpo de POST sin procesar en Python Flask independientemente del encabezado de tipo de contenido (4)
Previamente, pregunté Cómo obtener los datos recibidos en la solicitud de Flask porque request.data
estaba vacío. La respuesta explicaba que request.data
es el cuerpo del mensaje en bruto, pero estará vacío si se analizan los datos del formulario. ¿Cómo puedo obtener el cuerpo de publicación sin procesar incondicionalmente?
@app.route(''/'', methods=[''POST''])
def parse_request():
data = request.data # empty in some cases
# always need raw data here, not parsed form data
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.
Debes tener cuidado de que los datos de la publicación no sean demasiado grandes o de que tengas problemas de memoria en tu 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
Finalmente descubrí si hago esto:
request.environ[''CONTENT_TYPE''] = ''application/something_Flask_ignores''
Entonces request.data
realidad tendrá los datos de la publicación. Esto es así si no puede controlar la solicitud del cliente y desea anularla en el servidor.
Hay request.stream
cuando el tipo de mime no se reconoce.
data = request.stream.read()
Utilice request.get_data()
para obtener los datos sin formato, independientemente del tipo de contenido. Los datos se almacenan en caché y posteriormente puede acceder request.data
, request.json
, request.form
a voluntad.
Si accede request.data
primero, llamará a get_data
con un argumento para analizar primero los datos del formulario. Si la solicitud tiene un tipo de contenido de formulario ( multipart/form-data
, application/x-www-form-urlencoded
, o application/x-url-encoded
), los datos brutos se consumirán. request.data
y request.json
aparecerán vacíos en este caso.