2012-05-03 16 views
313

Desidero essere in grado di ottenere i dati inviati all'app Flask. Ho provato ad accedere a request.data ma è una stringa vuota. Come accedi ai dati della richiesta?Come ottenere i dati ricevuti in richiesta Flask

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

La risposta a questa domanda mi ha portato a chiedere Get raw POST body in Python Flask regardless of Content-Type header successivo, che è circa ottenere i dati grezzi piuttosto che i dati analizzati.

risposta

491

Il docs descrive gli attributi disponibili sulla richiesta. Nella maggior parte dei casi comuni request.data sarà vuoto perchè è usato come ripiego:

request.data contiene i dati di richiesta in arrivo come stringa nel caso in cui ne è venuto con un mimetype Flask non gestisce.

  • request.args: la chiave/valore coppie nella stringa di query URL
  • request.form: le coppie chiave/valore nel corpo, da una forma posta HTML, JavaScript o richiesta che non è JSON codificati
  • request.files: i file nel corpo, che Flask mantiene separati da form. I moduli HTML devono utilizzare enctype=multipart/form-data o i file non verranno caricati.
  • request.values: combinato args e form, preferendo args se le chiavi si sovrappongono

Tutti questi sono MultiDict istanze. È possibile accedere a valori utilizzando:

  • request.form['name']: utilizzare l'indicizzazione se si conosce la chiave esiste
  • request.form.get('name'): utilizzare get se la chiave potrebbe non esistere
  • request.form.getlist('name'): utilizzare getlist se la chiave viene inviato più volte e vuoi una lista di valori. get restituisce solo il primo valore.
+65

_Nota: _ Per ottenere il payload come JSON è possibile utilizzare 'request.get_json()'. – albert

+14

Aggiunta al commento di @ albert, 'request.get_json (force = True)' può essere usato. Dalla documentazione: 'force - se impostato su True il tipo di mimo viene ignorato., Quindi non restituirà' None' per le richieste che non hanno 'application/json' impostato nell'intestazione' contentType'. – plsnoban

+1

@ fujianjin6471: vedere [documenti qui] (http://flask.pocoo.org/docs/0.12/api/#flask.Request.get_json) – albert

148
from flask import request 
request.data 
+13

Per documentazione su questo vedere http://flask.pocoo.org/docs/ quickstart/# accessing-request-data e http://flask.pocoo.org/docs/api/#incoming-request-data. –

+33

Downvoting per ragioni spiegate da Robert. – Paul

+3

funziona se si specifica contentType (ad es., 'Applications/json') nella richiesta – tldr

92

E 'semplicemente la seguente

Per URL di parametrizzazione, utilizzare request.args

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

Per ingresso Modulo, utilizzare Request.Form

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

Per il tipo di dati applicazione/json, utilizzare la richiesta .Dati

# data in string format and you have to parse into dictionary 
data = request.data 
dataDict = json.loads(data) 
+27

Flask ha una scorciatoia per JSON: [request.get_json()] (http: // flask .pocoo.org/docs/0.10/api/# flask.Request.get_json) –

+0

se i dati inviati tramite POST è necessario utilizzare request.form.get ('') – mcolak

17

Flask ha un altro collegamento per JSON:

Intestazione:

{Content-Type: application/json} 

@app.route("/something", methods=["POST"]) 
def do_something(): 
    data = request.get_json() 
+1

Si noti che la documentazione dice "Il metodo' get_json() ' dovrebbe essere usato invece. " – nyuszika7h

+2

Sì, __request.json__ è ora deprecato. Usa invece il metodo __get_json() __ – Nabin

+0

Ho modificato questa risposta (corretta), ma usando il 'non-deprecato' get_json() 'come da suggerimenti qui.Una risposta corretta è migliore di una risposta obsoleta con commenti (validi). –

9

se si desidera che il corpo dopo cruda a prescindere dal tipo di contenuto, si dovrebbe utilizzare request.get_data(), perché request.form è convertito nel formato werkzeug.ImmutableMultiDict.

2
len = request.headers["Content-Length"] 
data=request.stream.read() 

Ora, i dati è il corpo della richiesta

28

do un esempio completo di 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) 

uso postino per la richiesta del messaggio:

enter image description here

uso ricciolo comando:

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

P.S. Per URL query di esempio parametro, si può vedere la mia risposta in Multiple parameters in in Flask approute

+0

Perché dovresti usare 'request.json' se lo converti nuovamente con' json.dumps() 'comunque? – nyuszika7h

+0

@ nyuszika7h, non per qualsiasi applicazione pratica, ma solo per mostrare il risultato. –

3

Semplicemente parlando, è possibile ottenere i dati dal modo in cui qui di seguito:

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

Ora, g.data è un'istanza di werkzeug.ImmutableMultiDict. Quindi puoi utilizzare g.data che può gestire gran parte delle tue esigenze. Ad esempio, è possibile utilizzarlo proprio come questo:

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

Naturalmente, è possibile utilizzare al posto di blueprintapp ~~

Problemi correlati