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.
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-Abfragezeichenfolgerequest.form
: Die Schlüssel/Wert-Paare im Hauptteil aus einem HTML-Post-Formular oder einer JavaScript-Anforderung, die nicht JSON-codiert istrequest.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 überschneidenAlle 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 existiertrequest.form.get('name')
: Verwenden Sie get
, wenn der Schlüssel möglicherweise nicht vorhanden istrequest.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.from flask import request
request.data
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)
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:
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
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()
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.
@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)
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
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 .
length = request.headers["Content-Length"]
data=request.stream.read()
Daten sind jetzt der Anfragetext
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
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()
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
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.
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([])
!