Comment obtenir les données reçues dans la demande de flacon
je veux pouvoir envoyer les données à mon application Flask. J'ai essayé d'accéder à request.data
mais c'est une chaîne vide. Comment accéder aux données de la demande?
@app.route('/', methods=['GET', 'POST'])
def parse_request():
data = request.data # data is empty
# need posted data here
la réponse à cette question m'a amené à demander obtenir le corps de poste brut dans un flacon Python indépendamment de L'en-tête de type de contenu suivant, qui est d'obtenir les données brutes plutôt que les données parsées.
14 réponses
le docs décrit les attributs disponibles sur la demande. Dans la plupart des cas request.data
sera vide parce qu'il est utilisé comme un repli:
request.data
contient les données de la requête entrante sous forme de chaîne de caractères au cas où elle serait fournie avec une fiole mimetype Non manipulée.
-
request.args
: les couples clé / valeur dans la chaîne de requête URL -
request.form
: les couples clé / valeur dans le corps, à partir D'un formulaire HTML post, ou une requête JavaScript qui n'est pas codée JSON -
request.files
: les fichiers dans le corps, que la fiole garde séparé deform
. Les formulaires HTML doivent utiliserenctype=multipart/form-data
ou les fichiers ne seront pas téléchargés. -
request.values
: combinaison deargs
etform
, préférantargs
si les clés se chevauchent
Tous ces éléments sont des MultiDict
instances. Vous pouvez accéder aux valeurs en utilisant:
-
request.form['name']
: utiliser l'indexation si vous savez que la clé existe -
request.form.get('name')
: utiliserget
si la clé n'existe pas -
request.form.getlist('name')
: utilisezgetlist
si la clé est envoyée plusieurs fois et que vous voulez une liste de valeurs.get
ne renvoie que la première valeur.
il est simplement comme suit
Pour URL paramètre de Requête , utilisez demande.args
search = request.args.get("search")
page = request.args.get("page")
Pour Formulaire de saisie , utilisez demande.formulaire
email = request.form.get('email')
password = request.form.get('password')
Pour "151960920 type de données" application/json , utilisez demande.données
# data in string format and you have to parse into dictionary
data = request.data
dataDict = json.loads(data)
je donne un exemple complet 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)
utiliser Postman pour la requête post:
utiliser curl "151940920 de la commande":
curl -i -H "Content-Type: application/json" -X POST -d '{"userId":"1", "username": "fizz bizz"}' http://localhost:5000/foo
P. S. Pour L'exemple de paramètre de requête URL, vous pouvez voir ma réponse dans paramètres multiples dans le flacon approute
Flacon a un autre raccourci pour JSON:
en-tête:
{Content-Type: application/json}
@app.route("/something", methods=["POST"])
def do_something():
data = request.get_json()
si vous voulez le corps du message brut quel que soit le type de contenu, vous devez utiliser request.get_data()
, parce que request.form
est converti en werkzeug.ImmutableMultiDict
format.
simplement, vous pouvez obtenir des données par la voie ci-dessous:
@app.before_request
def before_request():
g.data = request.get_json() or request.values
maintenant, g.data
est une instance de werkzeug.ImmutableMultiDict
. Ensuite, vous pouvez utiliser g.data
qui peut gérer la plupart de vos besoins. Par exemple, vous pouvez l'utiliser comme ceci:
@app.route("/something", methods=["POST"])
def do_something():
result = handle(g.data)
return jsonify(data=result)
bien sûr, vous pouvez utiliser blueprint
au lieu de app
~
@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)
len = request.headers["Content-Length"]
data=request.stream.read()
maintenant, les données sont le corps de demande
par request.form
.
au lieu d'obtenir un seul formulaire de données ( request.form["field_name"]
), vous pouvez obtenir toutes les données postées, en analysant le ImmutableDict
fourni par request.form
objet, comme ceci:
Fiole (Route)
@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"
}
pour plus de détails, ce Gist .
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()
si le type mime est reconnu, alors les deux request.data
et request.get_data()
retourneront des chaînes vides.
pour obtenir le contenu complet indépendamment, vous devez appeler request.get_data(as_text=True)
.
voir http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data
pour ceux comme moi qui ont oublié (un peu) à propos de HTML, soyez sûr que <input>
dans votre <form>
a un attribut 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()
résultat sur console:
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')])
Non nom de l'attribut = pas de données dans ImmutableMultiDict([])
!
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})