it-swarm.com.de

Wie bekomme ich POSTed json in Flask?

Ich versuche, eine einfache API mit Flask zu erstellen, in der ich jetzt POSTed JSON lesen möchte. Ich mache den Post mit der Erweiterung PostMan Chrome , und der JSON, den ich poste, 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

Auf dem Browser gibt es die UUID, die ich in GET eingegeben habe, korrekt zurück, aber auf der Konsole druckt es einfach None aus (wobei ich erwarte, dass es den {"text":"lalala"} ausgibt. Weiß jemand, wie ich es bekommen kann das gepostete JSON aus der Flask Methode?

267
kramer65

Zuallererst ist das .json Attribut eine Eigenschaft, die an die request.get_json() Methode delegiert, die dokumentiert, warum Sie None hier sehen.

Sie müssen den Anforderungsinhaltstyp auf application/json setzen, damit die Eigenschaft .json und die Methode .get_json() (ohne Argumente) funktionieren, da sie andernfalls None erzeugen. Siehe die Flask Request Dokumentation :

Dies enthält die geparsten JSON-Daten, wenn der Mimetyp JSON ( application/json angibt, siehe is_json() ), andernfalls ist es None.

Sie können request.get_json() anweisen, die Anforderung des Inhaltstyps zu überspringen, indem Sie das Schlüsselwortargument force=True übergeben.

Beachten Sie, dass Ihre JSON-Daten ungültig sind, wenn zu diesem Zeitpunkt eine Ausnahme ausgelöst wird (was möglicherweise zu einer 400-Fehlerantwort führt) . Es ist irgendwie missgebildet; Möglicherweise möchten Sie dies mit einem JSON-Validator überprüfen.

366
Martijn Pieters

Als Referenz finden Sie hier den vollständigen Code zum Senden von JSON von einem Python-Client:

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 beschrieben: JSON mit Python Requests posten

Und der obige Client funktioniert mit diesem serverseitigen Code:

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

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

if __== '__main__':
    app.run(Host= '0.0.0.0',debug=True)
79
Luke

So würde ich es machen und so sollte es sein

@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
    content = request.get_json(silent=True)
    # print(content) # Do your processing
    return uuid

Wenn silent=True eingestellt ist, schlägt die Funktion get_json beim Versuch, den JSON-Body abzurufen, unbemerkt fehl. Standardmäßig ist dies auf False eingestellt.

Die Einstellung force=True ignoriert die request.headers.get('Content-Type') == 'application/json' Prüfung, die flask für Sie durchführt. Standardmäßig ist dies auch auf False eingestellt.

Siehe Dokumentation der Flasche .

Ich würde nachdrücklich empfehlen, force=False zu lassen und den Client zu veranlassen, den Header Content-Type zu senden, um ihn eindeutiger zu machen.

Hoffe das hilft!

64
radtek

Angenommen, Sie haben einen gültigen JSON-Code mit dem Inhaltstyp application/json gepostet, dann enthält request.json die analysierten JSON-Daten.

from flask import Flask, request, jsonify

app = Flask(__name__)


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

Wir können Parameter verwenden, um die JSON-Daten aufzulösen

import flask
from flask import request, jsonify
import Parameters

application = flask.Flask(__name__)

@application.route('/myappp', methods=['POST'])
    @cross_Origin('*')
    def User_details_by_mailID():
        payload = request.get_json()
        email = payload[Parameters.email]
        return jsonify(email)
0
Aakash Handa