Gibt die JSON-Antwort aus der Flask-Ansicht zurück

464

Ich habe eine Funktion, die eine CSV-Datei mit Pandas analysiert und ein Diktat mit zusammenfassenden Informationen erstellt. Ich möchte die Ergebnisse als Antwort aus einer Flask-Ansicht zurückgeben. Wie gebe ich eine JSON-Antwort zurück?

@app.route("/summary")
def summary():
    d = make_summary()
    # send it back as json
Code Ninja
quelle

Antworten:

753

Übergeben Sie die Zusammenfassungsdaten an die jsonifyFunktion, die eine JSON-Antwort zurückgibt.

from flask import jsonify

@app.route('/summary')
def summary():
    d = make_summary()
    return jsonify(d)

Ab Flask 0.11 können Sie jeden JSON-serialisierbaren Typ, nicht nur diktieren, als Objekt der obersten Ebene übergeben.

Codegeek
quelle
4
Ab Flask 1.1.0 können Sie jetzt direkt ein Python-Diktat zurückgeben, das von Flask automatisch bestätigt wird.
Adrien Ball
203

jsonifyserialisiert die Daten, die Sie an JSON übergeben. Wenn Sie die Daten selbst serialisieren möchten, erstellen Sie jsonifyeine Antwort mit status=200und mimetype='application/json'.

from flask import json

@app.route('/summary')
def summary():
    data = make_summary()
    response = app.response_class(
        response=json.dumps(data),
        status=200,
        mimetype='application/json'
    )
    return response
scls
quelle
129

Übergeben Sie Schlüsselwortargumente an flask.jsonifyund sie werden als JSON-Objekt ausgegeben.

@app.route('/_get_current_user')
def get_current_user():
    return jsonify(
        username=g.user.username,
        email=g.user.email,
        id=g.user.id
    )
{
    "username": "admin",
    "email": "admin@localhost",
    "id": 42
}

Wenn Sie bereits ein Diktat haben, können Sie es direkt als übergeben jsonify(d).

zengr
quelle
1
Wie pro 1.1.0 Release Notes ermöglicht Rückkehr Flask ein Wörterbuch aus einer View - Funktion. Ähnlich wie beim Zurückgeben eines Strings eine Text- / HTML-Antwort erzeugt wird, wird beim Zurückgeben eines Diktats jsonify aufgerufen, um eine Anwendungs- / json-Antwort zu erzeugen.
CodeMantle
34

Wenn Sie jsonifyaus irgendeinem Grund nicht verwenden möchten , können Sie das, was es tut, manuell ausführen. Rufen Sie flask.json.dumpsauf, um JSON-Daten zu erstellen, und geben Sie dann eine Antwort mit dem application/jsonInhaltstyp zurück.

from flask import json

@app.route('/summary')
def summary():
    data = make_summary()
    response = app.response_class(
        response=json.dumps(data),
        mimetype='application/json'
    )
    return response

flask.jsonunterscheidet sich vom eingebauten jsonModul. Es verwendet das schnellere simplejsonModul, sofern verfügbar, und ermöglicht verschiedene Integrationen in Ihre Flask-App.

Anthony Awuley
quelle
17

Wenn Sie eine vom Benutzer hochgeladene Datei analysieren möchten, zeigt der Flask- Schnellstart , wie Sie Dateien von Benutzern abrufen und darauf zugreifen können. Holen Sie sich die Datei von request.filesund übergeben Sie sie an die Zusammenfassungsfunktion.

from flask import request, jsonify
from werkzeug import secure_filename

@app.route('/summary', methods=['GET', 'POST'])
def summary():
    if request.method == 'POST':
        csv = request.files['data']
        return jsonify(
            summary=make_summary(csv),
            csv_name=secure_filename(csv.filename)
        )

    return render_template('submit_data.html')

Ersetzen Sie den 'data'Schlüssel für request.filesdurch den Namen der Dateieingabe in Ihrem HTML-Formular.

teechap
quelle
13

So geben Sie eine JSON-Antwort zurück und legen einen Statuscode fest make_response:

from flask import jsonify, make_response

@app.route('/summary')
def summary():
    d = make_summary()
    return make_response(jsonify(d), 200)

Inspiration aus diesem Kommentar im Flask Issue Tracker.

Rubel
quelle
10

Ich benutze einen Dekorateur, um das Ergebnis von zurückzugeben jsonfiy. Ich denke, es ist besser lesbar, wenn eine Ansicht mehrere Rückgaben hat. Dies unterstützt nicht die Rückgabe eines Tupels wie content, status, aber ich behandle app.errorhandlerstattdessen die Rückgabe von Fehlerstatus mit .

import functools
from flask import jsonify

def return_json(f):
    @functools.wraps(f)
    def inner(**kwargs):
        return jsonify(f(**kwargs))

    return inner

@app.route('/test/<arg>')
@return_json
def test(arg):
    if arg == 'list':
        return [1, 2, 3]
    elif arg == 'dict':
        return {'a': 1, 'b': 2}
    elif arg == 'bool':
        return True
    return 'none of them'
Iman
quelle
4

Vor Flask 0.11 konnte jsonfiyein Array nicht direkt zurückgegeben werden. Übergeben Sie die Liste stattdessen als Schlüsselwortargument.

@app.route('/get_records')
def get_records():
    results = [
        {
          "rec_create_date": "12 Jun 2016",
          "rec_dietary_info": "nothing",
          "rec_dob": "01 Apr 1988",
          "rec_first_name": "New",
          "rec_last_name": "Guy",
        },
        {
          "rec_create_date": "1 Apr 2016",
          "rec_dietary_info": "Nut allergy",
          "rec_dob": "01 Feb 1988",
          "rec_first_name": "Old",
          "rec_last_name": "Guy",
        },
    ]
    return jsonify(results=list)
mania_device
quelle
2

Wenn Sie in Flask 1.1 ein Wörterbuch zurückgeben, wird es automatisch in JSON konvertiert. Wenn Sie also make_summary()ein Wörterbuch zurückgeben, können Sie dies tun

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d

Die SO, die nach dem Einfügen des Statuscodes fragt, wurde als Duplikat zu diesem geschlossen. Um diese Frage auch zu beantworten, können Sie den Statuscode einfügen, indem Sie ein Tupel des Formulars zurückgeben (dict, int). Das dictwird in JSON konvertiert und intist der HTTP-Statuscode. Ohne Eingabe ist der Status der Standardwert 200. Im obigen Beispiel wäre der Code also 200. Im folgenden Beispiel wird er in 201 geändert.

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d, 201  # 200 is the default

Sie können den Statuscode mit überprüfen

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
Steven C. Howell
quelle
0

Wenn es ein Diktat ist, kann der Kolben es direkt zurückgeben (Version 1.0.2).

def summary():
    d = make_summary()
    return d, 200
c8999c 3f964f64
quelle
0

"" Verwenden der Flask Class-Base View "" "

from flask import Flask, request, jsonify

from flask.views import MethodView

app = Flask(**__name__**)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))

class Summary(MethodView):

    def __init__(self):
        self.response = dict()

    def get(self):
        self.response['summary'] = make_summary()  # make_summary is a method to calculate the summary.
        return jsonify(self.response)
Manish Sharma
quelle