Cómo obtener datos recibidos en la solicitud de matraz


Quiero ser capaz de obtener los datos enviados a mi aplicación Flask. He intentado acceder a request.data pero es una cadena vacía. ¿Cómo se accede a los datos de solicitud?

@app.route('/', methods=['GET', 'POST'])
def parse_request():
    data = request.data  # data is empty
    # need posted data here

La respuesta a esta pregunta me llevó a preguntar Obtener el cuerpo del post sin procesar en Python Flask independientemente del encabezado Content-Type siguiente, que se trata de obtener los datos sin procesar en lugar de los datos analizados.

 423
Author: Cœur, 2012-05-03

14 answers

Los documentos describen los atributos disponibles en la solicitud. En la mayoría de los casos request.data estará vacío porque se usa como alternativa:

request.data Contiene los datos de la solicitud entrante como cadena en caso de que venga con un tipo mime Flask no maneja.

  • request.args: los pares clave/valor en la cadena de consulta URL
  • request.form: los pares clave / valor en el cuerpo, desde un formulario de publicación HTML o solicitud JavaScript que no es JSON codificado
  • request.files: los archivos en el cuerpo, que Matraz mantiene separado de form. Los formularios HTML deben usar enctype=multipart/form-data o los archivos no se cargarán.
  • request.values: combinado args y form, prefiriendo args si las claves se superponen

Todos estos son MultiDict las instancias. Puede acceder a los valores usando:

  • request.form['name']: usa la indexación si sabes que la clave existe
  • request.form.get('name'): use get si la clave puede no existir
  • request.form.getlist('name'): use getlist si la clave es enviado varias veces y desea una lista de valores. get solo devuelve el primer valor.
 687
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 15:18:15
from flask import request
request.data
 163
Author: clyfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-03 15:38:22

Es simplemente como sigue

Para URL Query parameter, use request.args

search = request.args.get("search")
page = request.args.get("page")

For Form input, use request.formulario

email = request.form.get('email')
password = request.form.get('password')

Para data type application/json, use request.datos

# data in string format and you have to parse into dictionary
data = request.data
dataDict = json.loads(data)
 124
Author: Fizer Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-12 15:22:24

Doy un ejemplo completo de application/json:

from flask import Flask, abort, request 
import json

app = Flask(__name__)


@app.route('/foo', methods=['POST']) 
def foo():
    if not request.json:
        abort(400)
    print request.json
    return json.dumps(request.json)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

Use Cartero para la solicitud de correo:

introduzca la descripción de la imagen aquí

Use curl comando:

curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo

P.d. Para el ejemplo de parámetro de consulta de URL, puede ver mi respuesta en Múltiples parámetros en in Flask approute

 48
Author: Little Roys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-29 12:49:57

Flask tiene otro atajo para JSON:

Cabecera:

{Content-Type: application/json}

@app.route("/something", methods=["POST"])
def do_something():
    data = request.get_json()
 24
Author: Amit Karnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-10 16:54:19

Si desea el cuerpo del post sin procesar independientemente del tipo de contenido, debe usar request.get_data(), porque request.form se convierte al formato werkzeug.ImmutableMultiDict.

 16
Author: Xiao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-14 07:29:47

Simplemente hablando, puede obtener datos de la siguiente manera:

@app.before_request
def before_request():
    g.data = request.get_json() or request.values

Ahora, g.data es una instancia de werkzeug.ImmutableMultiDict. Luego puede usar g.data que puede manejar la mayoría de sus requisitos. Por ejemplo, puedes usarlo así:

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(g.data)
    return jsonify(data=result)

Por supuesto, puede usar blueprint en lugar de app~~

 7
Author: zhangqy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 12:46:38
@app.route('/', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True) # force=True will make sure this works even if a client does not specify application/json
    language = req_data['language'] # or whatever key you have in your json

    return '''The language value is: {}'''.format(language)
 5
Author: Tarik Fojnica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-25 20:53:48
len = request.headers["Content-Length"]
data=request.stream.read()

Ahora, data es el cuerpo de la solicitud

 4
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 15:46:11

Usando request.form.

En lugar de obtener datos de un solo formulario (request.form["field_name"]), puede obtener todos los datos publicados, analizando el ImmutableDict proporcionado por el objeto request.form, de la siguiente manera:

Matraz (Ruta)

@app.route('/data', methods=['POST'])                                           
def f_data():                                                                   
    if request.method == "POST":
        fields = [k for k in request.form]                                      
        values = [request.form[k] for k in request.form]
        data = dict(zip(fields, values))
    return jsonify(data) 

Shell

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}

Para más detalles, esta Esencia.

 2
Author: ivanleoncz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-07 18:22:46

En javascript:

var value_data = [1,2,3,4];

$.ajax({
        type: 'POST',
        url: '/',
        data:JSON.stringify(value_data),
        success: function (response) {
            alert("Data added successfully");
         },    
});

En python:

client_data = request.get_data()
 1
Author: vaishali chaudhari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-11 14:01:10

Si se reconoce el tipo mime, tanto request.data como request.get_data() devolverán cadenas vacías.

Para obtener el contenido completo de todos modos, debe llamar a request.get_data(as_text=True).

Véase http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data

 1
Author: Zavec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-21 22:52:42

Para aquellos como yo que han olvidado (un poco) sobre HTML, asegúrese de que <input> en su <form> tiene un atributo name=""!

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    print("Posted data : {}".format(request.form))

    return """
<form method="post">
    <input type="text">
    <input type="text" id="idtxt2">
    <input type="text" name="txt3" id="idtxt3">  
    <input type="submit" Value="Hopla!">
</form>
"""

if __name__ == "__main__":
    app.run()

Resultado en la consola:

freezed@machine % python3 run.py
 * Serving Flask app "flaskstuff.views" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 268-634-781
127.0.0.1 - - [20/Aug/2018 16:52:59] "POST / HTTP/1.1" 200 -
Posted data : ImmutableMultiDict([('txt3', 'text 3')])

No nombre atributo = no hay datos en ImmutableMultiDict([])!

 0
Author: freezed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-02 15:50:47
from flask import Flask, request, jsonify

@app.route('/added', methods=['POST'])
def add():
    data = request.get_json(force=True)
    l = {'name': data['name']}
    lingual.append(l)

    return jsonify({'lang': lingual})
 -1
Author: aakash gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-21 22:49:18