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.

423
demandé sur Cœur 2012-05-03 19:31:26

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é de form . Les formulaires HTML doivent utiliser enctype=multipart/form-data ou les fichiers ne seront pas téléchargés.
  • request.values : combinaison de args et form , préférant args 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') : utiliser get si la clé n'existe pas
  • request.form.getlist('name') : utilisez getlist si la clé est envoyée plusieurs fois et que vous voulez une liste de valeurs. get ne renvoie que la première valeur.
687
répondu Robert 2018-01-23 15:18:15
from flask import request
request.data
163
répondu clyfish 2012-05-03 15:38:22

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)
124
répondu Fizer Khan 2014-08-12 15:22:24

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:

enter image description here

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

48
répondu Little Roys 2018-03-29 12:49:57

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()
24
répondu Amit Karnik 2017-11-10 16:54:19

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.

16
répondu Xiao 2015-08-14 07:29:47

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 ~

7
répondu zhangqy 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
répondu Tarik Fojnica 2018-03-25 20:53:48
len = request.headers["Content-Length"]
data=request.stream.read()

maintenant, les données sont le corps de demande

4
répondu Daniel 2016-07-11 15:46:11

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 .

2
répondu ivanleoncz 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
répondu vaishali chaudhari 2018-05-11 14:01:10

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

1
répondu Zavec 2018-08-21 22:52:42

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([]) !

0
répondu freezed 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
répondu aakash gupta 2018-07-21 22:49:18