Rufen Sie die in einer Flask-Anfrage empfangenen Daten ab

736

Ich möchte in der Lage sein, die Daten an meine Flask-App zu senden. Ich habe versucht, darauf zuzugreifen, request.dataaber es ist eine leere Zeichenfolge. Wie greifen Sie auf Anforderungsdaten zu?

from flask import request

@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 body in Python Flask unabhängig vom nächsten Content-Type-Header zu fragen , bei dem es darum geht, die Rohdaten und nicht die analysierten Daten abzurufen.

ddinchev
quelle

Antworten:

1265

In den Dokumenten werden die in der Anforderung verfügbaren Attribute beschrieben. In den meisten Fällen request.dataist es leer, da es als Fallback verwendet wird:

request.data Enthält die eingehenden Anforderungsdaten als Zeichenfolge, falls sie mit einem Mimetyp geliefert wurden, den Flask nicht verarbeitet.

  • request.args: Die Schlüssel / Wert-Paare in der URL-Abfragezeichenfolge
  • request.form: Die Schlüssel / Wert-Paare im Textkörper aus einem HTML-Post-Formular oder einer JavaScript-Anforderung, die nicht JSON-codiert ist
  • request.files: die Dateien im Körper, von denen Flask getrennt bleibt form. HTML-Formulare müssen verwendet enctype=multipart/form-datawerden, sonst werden keine Dateien hochgeladen.
  • request.values: kombiniert argsund formbevorzugt, argswenn sich Tasten überschneiden
  • request.json: analysierte JSON-Daten. Die Anforderung muss den application/jsonInhaltstyp haben oder request.get_json(force=True)zum Ignorieren des Inhaltstyps verwendet werden.

All dies sind MultiDictInstanzen (außer json). Sie können auf Werte zugreifen, indem Sie:

  • request.form['name']: Verwenden Sie die Indizierung, wenn Sie wissen, dass der Schlüssel vorhanden ist
  • request.form.get('name'): Verwenden Sie getdiese Option, wenn der Schlüssel möglicherweise nicht vorhanden ist
  • request.form.getlist('name'): Verwenden getlistSie diese Option, wenn der Schlüssel mehrmals gesendet wird und Sie eine Liste mit Werten wünschen. getgibt nur den ersten Wert zurück.
Robert
quelle
204

Verwenden Sie zum Abrufen der Rohdaten request.data. Dies funktioniert nur, wenn es nicht als Formulardaten analysiert werden konnte. Andernfalls ist es leer und enthält request.formdie analysierten Daten.

from flask import request
request.data
Clyfish
quelle
178

Verwenden Sie für URL-Abfrageparameter request.args.

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

Verwenden Sie für die Eingabe von Formularen request.form.

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

application/jsonVerwenden Sie für JSON mit Inhaltstyp request.get_json().

data = request.get_json()
Fizer Khan
quelle
98

Hier ist ein Beispiel für das Parsen und Veröffentlichen von geposteten JSON-Daten.

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/foo', methods=['POST']) 
def foo():
    data = request.json
    return jsonify(data)

So posten Sie JSON mit Curl:

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

Oder um Postman zu benutzen:

Verwenden von Postboten zum Posten von JSON

Kleine Roys
quelle
36

Wenn Sie JSON mit Inhaltstyp veröffentlichen application/json, verwenden Sie request.get_json(), um es in Flask abzurufen. Wenn der Inhaltstyp nicht korrekt ist, Nonewird zurückgegeben. Wenn die Daten nicht JSON sind, wird ein Fehler ausgelöst.

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

Verwenden Sie, um den unformatierten Post-Body unabhängig vom Inhaltstyp abzurufen request.get_data(). Wenn Sie verwenden request.data, wird aufgerufen request.get_data(parse_form_data=True), wodurch das ausgefüllt request.form MultiDictund dataleer gelassen wird.

Xiao
quelle
18

request.formVerwenden Sie, um ein normales Wörterbuch zu erhalten request.form.to_dict(flat=False).

Übergeben Sie JSON-Daten für eine API an jsonify.

In diesem Beispiel werden Formulardaten als JSON-Daten zurückgegeben.

@app.route('/form_to_json', methods=['POST'])
def form_to_json():
    data = request.form.to_dict(flat=False)
    return jsonify(data)

Hier ist ein Beispiel für POST-Formulardaten mit Curl, die als JSON zurückgegeben werden:

$ curl http://127.0.0.1:5000/data -d "name=ivanleoncz&role=Software Developer"
{
  "name": "ivanleoncz", 
  "role": "Software Developer"
}
ivanleoncz
quelle
12

Verwenden Sie request.get_json()diese Option, um veröffentlichte JSON-Daten abzurufen.

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

Verwenden Sie request.formdiese Option , um Daten abzurufen, wenn Sie ein Formular mit der POST-Methode senden.

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

Verwenden Sie request.argsdiese Option , um Daten in der Abfragezeichenfolge der URL zu übergeben, z. B. beim Senden eines Formulars mit der GET-Methode.

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

request.formusw. sind diktartig. Verwenden Sie die getMethode, um einen Wert mit einem Standardwert abzurufen, wenn dieser nicht übergeben wurde.

Ravin Gupta
quelle
10

application/jsonVerwenden Sie, um JSON ohne Inhaltstyp zu veröffentlichen request.get_json(force=True).

@app.route('/process_data', methods=['POST'])
def process_data():
    req_data = request.get_json(force=True)
    language = req_data['language']
    return 'The language value is: {}'.format(language)
Tarik Fojnica
quelle
10

Die Rohdaten werden vom WSGI-Server als an die Flask-Anwendung übergeben request.stream. Die Länge des Streams befindet sich im Content-LengthHeader.

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

Es ist normalerweise sicherer, request.get_data()stattdessen zu verwenden .

Daniel
quelle
9

Um JSON mit jQuery in JavaScript zu veröffentlichen, müssen Sie JSON.stringifydie Daten sichern und den Inhaltstyp auf festlegen application/json.

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

$.ajax({
    type: 'POST',
    url: '/process',
    data: JSON.stringify(value_data),
    contentType: 'application/json',
    success: function (response_data) {
        alert("success");
    }   
});

Analysieren Sie es in Flask mit request.get_json() .

data = request.get_json()
Vaishali Chaudhari
quelle
8

Verwenden Sie zum Parsen von JSON request.get_json().

@app.route("/something", methods=["POST"])
def do_something():
    result = handle(request.get_json())
    return jsonify(data=result)
zhangqy
quelle
5

Hier ist ein Beispiel für das Posten von Formulardaten, um einen Benutzer zu einer Datenbank hinzuzufügen. Überprüfen Sie request.method == "POST", ob das Formular gesendet wurde. Verwenden Sie die Schlüssel von request.form, um die Formulardaten abzurufen. Rendern Sie eine HTML-Vorlage mit einem <form>anderen. Die Felder im Formular sollten nameAttribute haben , die mit den Schlüsseln in übereinstimmen request.form.

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route("/user/add", methods=["GET", "POST"])
def add_user():
    if request.method == "POST":
        user = User(
            username=request.form["username"],
            email=request.form["email"],
        )
        db.session.add(user)
        db.session.commit()
        return redirect(url_for("index"))

    return render_template("add_user.html")
<form method="post">
    <label for="username">Username</label>
    <input type="text" name="username" id="username">
    <label for="email">Email</label>
    <input type="email" name="email" id="email">
    <input type="submit">
</form>
Dulangi_Kanchana
quelle
4

Wenn der Inhaltstyp als Formulardaten erkannt request.datawird , wird dieser analysiert request.formund eine leere Zeichenfolge zurückgegeben.

Rufen Sie auf, um die Rohdaten unabhängig vom Inhaltstyp abzurufen request.get_data(). request.dataAnrufe get_data(parse_form_data=True), während die Standardeinstellung ist, Falsewenn Sie es direkt anrufen.

Zavec
quelle
4

Wenn der Körper als Formulardaten erkannt wird, befindet er sich in request.form. Wenn es JSON ist, wird es in sein request.get_json(). Andernfalls werden die Rohdaten in request.data. Wenn Sie nicht sicher sind, wie Daten übermittelt werden, können Sie eine orKette verwenden, um die erste mit Daten zu erhalten.

def get_request_data():
    return (
        request.args
        or request.form
        or request.get_json(force=True, silent=True)
        or request.data
    )

request.argsEnthält Argumente, die aus der Abfragezeichenfolge analysiert wurden, unabhängig davon, was sich im Body befand. Sie würden diese also entfernen, get_request_data()wenn sowohl sie als auch ein Body gleichzeitig Daten enthalten sollten.

Paul Gowder
quelle
2

Stellen Sie beim Posten von Formulardaten mit einem HTML-Formular sicher, dass die inputTags nameAttribute haben, da sie sonst nicht vorhanden sind request.form.

@app.route('/', methods=['GET', 'POST'])
def index():
    print(request.form)
    return """
<form method="post">
    <input type="text">
    <input type="text" id="txt2">
    <input type="text" name="txt3" id="txt3">  
    <input type="submit">
</form>
"""
ImmutableMultiDict([('txt3', 'text 3')])

Nur der txt3Eingang hatte ein name, also ist es der einzige Schlüssel, der in vorhanden ist request.form.

gefroren
quelle