it-swarm.com.de

JSON-Antwort aus Sicht Flask zurückgeben

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

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

Übergeben Sie die Zusammenfassungsdaten an die Funktion jsonify , 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.

633
codegeek

jsonify serialisiert die Daten, die Sie an JSON übergeben. Wenn Sie die Daten selbst serialisieren möchten, führen Sie die Schritte von jsonify aus, indem Sie eine Antwort mit status=200 und mimetype='application/json' erstellen.

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
172
scls

Übergeben Sie Schlüsselwortargumente an flask.jsonify und 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": "[email protected]",
    "id": 42
}
_

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

112
zengr

Wenn Sie jsonify aus irgendeinem Grund nicht verwenden möchten, können Sie das manuell tun. Rufen Sie flask.json.dumps auf, um JSON-Daten zu erstellen, und geben Sie eine Antwort mit dem Inhaltstyp application/json 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.json unterscheidet sich vom integrierten json Modul. Sofern verfügbar, wird das schnellere simplejson -Modul verwendet und es werden verschiedene Integrationen mit Ihrer Flask -App ermöglicht.

26
Anthony Awuley

Wenn Sie eine vom Benutzer hochgeladene Datei analysieren möchten, zeigt das Flask Schnellstart , wie Dateien von Benutzern abgerufen und darauf zugegriffen werden. Holen Sie sich die Datei von request.files und ü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.files durch den Namen der in Ihr HTML-Formular eingegebenen Datei.

16
teechap

Obwohl flask.jsonify einfach zu benutzen ist, bevorzuge ich einen Dekorateur, um json zurückzugeben. Es hilft, jeden json-Typ zurückzugeben, und ist besser lesbar, wenn Ihre Methode mehrere Rückgaben enthält. (Beachten Sie, dass dieses Beispiel für 200 Antworten funktioniert. Ich gebe Fehler mit Ausnahmen und Flask.errorhandler zurück.)

def return_json(f):
    @functools.wraps(f)
    def inner(*a, **k):
        return json.dumps(f(*a, **k))
    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 'non of them'
9
iman

Um eine JSON-Antwort zurückzugeben und einen Statuscode festzulegen, können Sie make_response verwenden:

from flask import jsonify, make_response

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

Diesbezügliche Inspiration Kommentar im Flask Issue-Tracker.

5
rouble

Vor Flask 0.11 erlaubte jsonfiy nicht, ein Array direkt zurückzugeben. Ü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)
4
mania_device

Wenn Sie eine json-Antwort zurückgeben müssen, um eine Rest-API zu implementieren, können Sie flask-restful ( https://flask-restful.readthedocs.io/en/latest/quickstart.html ) verwenden. Ich glaube, diese Lösung ist einfacher, belastbarer und irgendwie eleganter.

Hier ist ihr schneller Einstieg:

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __== '__main__':
    app.run(debug=True)
0
Rafael Borja

Python Flask JSON:

from flask import Flask, jsonify,request,json


app = Flask(__name__)



country = [
            {'name':'india'},
            {'name':'pakistian'},
            {'name':'US'},
            {'name':'UK'},
            {'name':'NZ'}
            ]


@app.route('/', methods=['GET'])
def test():

    return jsonify({
        'message': 'Hai'
    })



@app.route('/country', methods=['GET'])
def countryall():

    return jsonify({

        'country':country
    })


if __== '__main__':
    app.run(debug=True, port=8080)
0
Sankar guru