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.
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 deform
. Los formularios HTML deben usarenctype=multipart/form-data
o los archivos no se cargarán. -
request.values
: combinadoargs
yform
, prefiriendoargs
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')
: useget
si la clave puede no existir -
request.form.getlist('name')
: usegetlist
si la clave es enviado varias veces y desea una lista de valores.get
solo devuelve el primer valor.
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
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)
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:
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
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()
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
.
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
~~
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)
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
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.
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()
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
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([])
!
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})
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