497 Stimmen

Wie man in Flask JSON erhält, das mit POST übermittelt wurde?

Ich versuche, eine einfache API mit Flask zu erstellen, in der ich jetzt etwas POSTed JSON lesen möchte. Ich mache den POST mit der Postman Chrome-Erweiterung, und das JSON, das ich POSTe, lautet einfach {"text":"lalala"}. Ich versuche, das JSON mit der folgenden Methode zu lesen:

@app.route('/api/add_message/', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print content
    return uuid

Im Browser gibt es korrekt die UUID zurück, die ich im GET eingefügt habe, aber in der Konsole wird einfach None ausgegeben (wo ich erwarte, dass {"text":"lalala"} ausgegeben wird). Weiß jemand, wie ich das gepostete JSON innerhalb der Flask-Methode erhalten kann?

622voto

Martijn Pieters Punkte 953257

Zunächst ist das Attribut .json eine Eigenschaft, die an die Methode request.get_json() delegiert, was erklärt, warum Sie hier None sehen.

Sie müssen den Anforderungsinhaltstyp auf application/json setzen, damit das Attribut .json und die Methode .get_json() (ohne Argumente) funktionieren, da sonst beide None zurückgeben werden. Siehe die Flask Request Dokumentation:

Die geparsten JSON-Daten, wenn der mimetype auf JSON hinweist (application/json, siehe .is_json).

Sie können request.get_json() bitten, die Anforderung nach dem Inhaltstyp zu ignorieren, indem Sie ihr das Schlüsselwortargument force=True übergeben.

Beachten Sie, dass an dieser Stelle eine Ausnahme auftreten kann (möglicherweise mit einer Antwort 400 Bad Request), wenn Ihre JSON-Daten ungültig sind. Sie sind in irgendeiner Weise fehlerhaft; Sie könnten sie mit einem JSON-Validator überprüfen wollen.

199voto

Luke Punkte 4769

Zur Referenz hier der vollständige Code, wie man JSON von einem Python-Client sendet:

import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
    print(res.json())

Die Eingabe "json=" setzt automatisch den Inhaltstyp, wie hier diskutiert: Wie sendet man JSON-Daten mit Python Requests?

Und der obige Client funktioniert mit folgendem Serverseitigen Code:

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/api/add_message/', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.json
    print(content['mytext'])
    return jsonify({"uuid":uuid})

if __name__ == '__main__':
    app.run(host= '0.0.0.0',debug=True)

93voto

radtek Punkte 30114

Dies ist die Art und Weise, wie ich es tun würde und es sollte sein

@app.route('/api/add_message/', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    # print(content) # Führen Sie Ihre Verarbeitung durch
    return uuid

Mit silent=True wird die Funktion get_json still scheitern, wenn sie versucht, den JSON-Body abzurufen. Standardmäßig ist dies auf False gesetzt. Wenn Sie immer einen JSON-Body erwarten (nicht optional), lassen Sie ihn als silent=False.

Das Setzen von force=True ignoriert die Überprüfung request.headers.get('Content-Type') == 'application/json', die Flask für Sie durchführt. Standardmäßig ist dies ebenfalls auf False gesetzt.

Siehe Flask-Dokumentation.

Ich würde dringend empfehlen, force=False zu belassen und den Client den Header Content-Type senden zu lassen, um es expliziter zu machen.

34voto

trojek Punkte 3018

Angenommen, Sie haben gültiges JSON mit dem application/json Inhalts Typ gepostet, dann enthält request.json die geparsten JSON Daten.

from flask import Flask, request, jsonify

app = Flask(__name__)

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

16voto

Arcyno Punkte 3711

Für alle, deren Problem von dem Ajax-Aufruf stammte, hier ist ein vollständiges Beispiel :

Ajax-Aufruf: Der Schlüssel hier ist die Verwendung eines dict und dann JSON.stringify

    var dict = {Benutzername : "Benutzername" , Passwort:"Passwort"};

    $.ajax({
        type: "POST", 
        url: "http://127.0.0.1:5000/", //localhost Flask
        data : JSON.stringify(dict),
        contentType: "application/json",
    });

Und auf der Serverseite :

from flask import Flask
from flask import request
import json

app = Flask(__name__)

@app.route("/",  methods = ['POST'])
def hallo():
    print(request.get_json())
    return json.dumps({'Erfolg':True}), 200, {'ContentType':'application/json'} 

if __name__ == "__main__":
    app.run()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X