wake-up-neo.com

So erhalten Sie Daten in der Flaschenanfrage

Ich möchte, dass die Daten an meine Flask-App gesendet werden. Ich habe versucht, auf request.data zuzugreifen, aber es ist eine leere Zeichenfolge. Wie greifen Sie auf die Anfragedaten zu?

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

Die Antwort auf diese Frage veranlasste mich, Get raw POST in Python Flask ungeachtet des Content-Type-Headers als nächstes zu fragen, bei dem es darum geht, die Rohdaten anstelle der analysierten Daten zu erhalten.

481
ddinchev

Die docs beschreiben die in der Anfrage verfügbaren Attribute. In den meisten Fällen ist request.data leer, da es als Fallback verwendet wird:

request.data Enthält die eingehenden Anforderungsdaten als Zeichenfolge, falls diese mit einem Mimetyp Flask geliefert wurde.

  • request.args: Die Schlüssel/Wert-Paare in der URL-Abfragezeichenfolge
  • request.form: Die Schlüssel/Wert-Paare im Hauptteil aus einem HTML-Post-Formular oder einer JavaScript-Anforderung, die nicht JSON-codiert ist
  • request.files: Die Dateien im Hauptteil, die Flask von form getrennt hält. HTML-Formulare müssen enctype=multipart/form-data verwenden, oder Dateien werden nicht hochgeladen.
  • request.values: kombinierte args und form, wobei args bevorzugt wird, wenn sich die Schlüssel überschneiden

Alle diese sind MultiDict Instanzen. Sie können auf Werte zugreifen mit:

  • request.form['name']: Verwenden Sie die Indizierung, wenn Sie wissen, dass der Schlüssel existiert
  • request.form.get('name'): Verwenden Sie get, wenn der Schlüssel möglicherweise nicht vorhanden ist
  • request.form.getlist('name'): Verwenden Sie getlist, wenn der Schlüssel mehrfach gesendet wird und Sie eine Liste mit Werten wünschen. get gibt nur den ersten Wert zurück.
795
Robert
from flask import request
request.data
174
clyfish

Es ist einfach wie folgt

Verwenden Sie für URL-Abfrageparameterrequest.args

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

Verwenden Sie für Formulareingaberequest.form

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

Verwenden Sie für Datentyp application/jsonrequest.data

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

Ich gebe ein vollständiges Beispiel für 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 __== '__main__':
    app.run(Host='0.0.0.0', port=5000, debug=True)

verwenden Sie Postman für die Postanforderung:

enter image description here

verwenden Sie den Befehl curl:

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

P.S . Zum Beispiel für URL-Abfrageparameter finden Sie meine Antwort in Mehrere Parameter in Flask approute

59
Little Roys

Flasche hat eine andere Abkürzung für JSON:

Header: 

{Content-Type: application/json}

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

wenn Sie den Rohtextkörper unabhängig vom Inhaltstyp verwenden möchten, sollten Sie request.get_data() verwenden, da request.form in das werkzeug.ImmutableMultiDict-Format umgewandelt wird.

18
Xiao
@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)
8
Tarik Fojnica

Einfach gesagt, können Sie Daten unten erhalten:

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

Nun ist g.data eine Instanz von werkzeug.ImmutableMultiDict. Dann können Sie g.data verwenden, der die meisten Ihrer Anforderungen erfüllt. Sie können es beispielsweise wie folgt verwenden:

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

Natürlich können Sie blueprint anstelle von app ~~ verwenden

8
zhangqy

request.form verwenden.

Anstatt einzelne Formulardaten (request.form["field_name"]) abzurufen, können Sie alle veröffentlichten Daten abrufen, indem Sie die ImmutableDict-Syntax analysieren, die vom request.form-Objekt bereitgestellt wird.

Flask (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"
}

Für weitere Details, diese Gist .

7
ivanleoncz
length = request.headers["Content-Length"]
data=request.stream.read()

Daten sind jetzt der Anfragetext

5
Daniel

Wenn der Mime-Typ erkannt wird, geben request.data und request.get_data() leere Zeichenfolgen zurück.

Um trotzdem den vollen Inhalt zu erhalten, müssen Sie request.get_data(as_text=True) aufrufen.

Siehe http://flask.pocoo.org/docs/1.0/api/#flask.Request.get_data

4
Zavec

In Javascript:

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

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

In Python:

client_data = request.get_data()
2
from flask import request

content = request.get_json()
name = content.get('name', '')

wenn Sie den Anfragetyp json angeben, werden Daten abgerufen, und Sie können auch Standardparameter angeben

from flask import request

content = request.form
name = content.get('name', '')

daten abrufen, wenn Anforderungsformular

from flask import request

request.args.get("name", "")

abrufen von Parametern aus der URL mit einer GET-Anforderung

2
Ravin Gupta

Dies ist eine Art schmutziger Hack, um alle Anfragedaten zu erhalten, unabhängig davon, wie sie gesendet wurden, aber ich benutze ernsthaft nur Folgendes: 

def get_request_info():
    args = str(request.args)
    form = str(request.form)
    files = str(request.files)
    maybe_json = request.get_json(silent=True, cache=False)
    if maybe_json:
        thejson = json.dumps(maybe_json)
    else:
        thejson = "no json"
    return # whatever you want 

und dann gebe ich einfach einen String zurück, der diese verkettet, oder wenn ich Lust habe, überspringe ich den String-Aufruf/json dump und füge alle Dicts zusammen. Dann kann dies protokolliert, in einer Ansichtsfunktion zurückgegeben werden, was auch immer, und Sie können die gesamte Anforderung tatsächlich anzeigen, unabhängig davon, was darin enthalten ist.

2
Paul Gowder

Für diejenigen wie mich, die HTML (ein bisschen) vergessen haben, stellen Sie sicher, dass <input> in Ihrem <form> ein name=""-Attribut hat!

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 __== "__main__":
    app.run()

Ergebnis auf der Konsole:

[email protected] % 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')])

Kein name-Attribut = keine Daten in ImmutableMultiDict([])!

1
freezed