Anteriormente, pregunté cómo obtener los datos recibidos en la solicitud de Flask porque request.data
estaba vacío. La respuesta explicó que request.data
es el cuerpo de la publicación sin formato, pero estará vacío si se analizan los datos del formulario. ¿Cómo puedo obtener el cuerpo de la 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
request.stream
es la secuencia de datos sin procesar que el servidor WSGI pasa a la aplicación. No se realiza el análisis al leerlo, aunque generalmente desearequest.get_data()
hacerlo.La secuencia estará vacía si fue leída previamente por
request.data
otro atributo.fuente
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.fuente
request.data
estará vacío sirequest.headers["Content-Type"]
se reconoce como datos de formulario, que se analizarán enrequest.form
. Para obtener los datos sin procesar independientemente del tipo de contenido, userequest.get_data()
.request.data
llamadasrequest.get_data(parse_form_data=True)
, lo que da como resultado un comportamiento diferente para los datos del formulario.fuente