Ich versuche, mit Flask eine einfache API zu erstellen, in der ich jetzt POSTed JSON lesen möchte. Ich mache den POST mit der Postman Chrome-Erweiterung und der JSON I POST ist einfach {"text":"lalala"}
. Ich versuche, den JSON mit der folgenden Methode zu lesen:
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
Im Browser wird die UUID, die ich in das GET eingegeben habe, korrekt zurückgegeben, aber auf der Konsole wird sie nur ausgedruckt None
(wo ich erwarte, dass sie die druckt {"text":"lalala"}
. Weiß jemand, wie ich den geposteten JSON über die Flask-Methode abrufen kann?
Als Referenz finden Sie hier den vollständigen Code zum Senden von JSON von einem Python-Client:
Die Eingabe "json =" legt automatisch den Inhaltstyp fest, wie hier beschrieben: JSON mit Python-Anforderungen posten
Und der obige Client funktioniert mit diesem serverseitigen Code:
quelle
So würde ich es machen und es sollte so sein
Mit
silent=True
setget_json
schlägt die Funktion stillschweigend fehl, wenn versucht wird, den JSON-Body abzurufen. Standardmäßig ist dies auf eingestelltFalse
. Wenn Sie immer einen JSON-Körper erwarten (nicht optional), lassen Sie ihn alssilent=False
.Die Einstellung
force=True
ignoriert dierequest.headers.get('Content-Type') == 'application/json'
Prüfung, die der Kolben für Sie durchführt. Standardmäßig ist dies ebenfalls eingestelltFalse
.Siehe Kolbendokumentation .
Ich würde dringend empfehlen
force=False
, denContent-Type
Header zu verlassen und den Header zu senden , um ihn expliziter zu machen.Hoffe das hilft!
quelle
silent=True
. Ja, das ist möglich und ich benutze es. Es basiert wirklich darauf, wie Sie Ihre API für den Verbrauch entwerfen. Wenn es für Ihren Endpunkt keinen solchen Fall gibt, entfernen Sie ihn einfachsilent=True
oder setzen Sie ihn explizit aufFalse
.print(content)
Aftercontent = request.get_json()
das Objekt ... aber als gültiges Python-Objekt (und nicht als gültiges JSON-Objekt). Beispielsweise werden einfache Anführungszeichen verwendet, während JSON ausschließlich doppelte Anführungszeichen für beide Schlüsselwerte (Zeichenfolgen) als Zeichenfolgenwerte erfordert. Wenn Sie die JSON-Darstellung möchten, verwenden Sie siejson.dumps()
mit dem Objekt.Angenommen, Sie haben gültiges JSON mit dem
application/json
Inhaltstyp veröffentlicht,request.json
werden die analysierten JSON-Daten angezeigt.quelle
response = request.post('http://127.0.0.1:5000/hello', json={"foo": "bar"})
. Nach diesem Laufresponse.json()
sollte zurückkehren{'foo': 'bar'}
{'foo': 'bar'}
JSON nicht gültig ist. Es könnte sich um eine gültige Python-Objektdarstellung handeln, die JSON sehr ähnlich sieht, aber für gültiges JSON werden ausschließlich doppelte Anführungszeichen verwendet.get_json()
dekodiert von JSON in Python-Objekte, ja. Wo erwarten Sie ein gültiges JSON-Dokument?.json()
oder.get_json()
eine gültige JSON-Objektdarstellung zurückgibt, kein Python-Diktat. Ich schaue nur auf den Namen und schließe daraus, was daraus entstehen könnte.Für alle, deren Problem vom Ajax-Aufruf herrührte, ist hier ein vollständiges Beispiel:
Ajax-Aufruf: Der Schlüssel hier ist, ein
dict
und dann zu verwendenJSON.stringify
Und auf der Serverseite:
quelle
Um einen anderen Ansatz zu geben.
quelle
Angenommen, Sie haben einen gültigen JSON veröffentlicht.
quelle
Versuchen Sie, den Force-Parameter zu verwenden ...
request.get_json(force = True)
quelle