web-dev-qa-db-fra.com

Renvoie la réponse JSON de la vue Flask

J'ai une fonction qui analyse un fichier CSV avec Pandas et produit un dict avec des informations résumées. Je souhaite renvoyer les résultats en réponse à partir d'une vue Flask. Comment renvoyer une réponse JSON?

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

Transmettez les données récapitulatives à la fonction jsonify , qui renvoie une réponse JSON.

from flask import jsonify

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

À partir de Flask 0.11, vous pouvez transmettre n'importe quel type sérialisable JSON, et pas seulement dict, en tant qu'objet de niveau supérieur.

633
codegeek

jsonify sérialise les données que vous transmettez à JSON. Si vous souhaitez sérialiser les données vous-même, faites ce que jsonify en créant une réponse avec status=200 et 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
172
scls

Passez les arguments de mot clé à flask.jsonify et ils seront générés sous forme d'objet JSON.

_@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
}
_

Si vous avez déjà un dict, vous pouvez le passer directement sous le nom jsonify(d).

112
zengr

Si vous ne voulez pas utiliser jsonify pour une raison quelconque, vous pouvez le faire manuellement. Appelez flask.json.dumps pour créer des données JSON, puis renvoyez une réponse avec le type de contenu application/json.

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 est distinct du module intégré json. Il utilisera le module simplejson plus rapide, s'il est disponible, et permet diverses intégrations avec votre application Flask.

26
Anthony Awuley

Si vous souhaitez analyser un fichier téléchargé par l'utilisateur, le Flask quickstart indique comment obtenir des fichiers d'utilisateurs et y accéder. Extrayez le fichier de request.files et transmettez-le à la fonction de résumé.

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')

Remplacez la touche 'data' pour request.files par le nom du fichier saisi dans votre formulaire HTML.

16
teechap

Bien que flask.jsonify soit facile à utiliser, je préfère utiliser un décorateur pour renvoyer JSON. Il est utile de renvoyer n'importe quel type de JSON et est plus lisible lorsque vous avez plusieurs retours dans votre méthode. (Notez que cet exemple fonctionne pour 200 réponses, je retourne les erreurs en levant des exceptions et Flask.errorhandler)

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

Pour renvoyer une réponse JSON et définir un code d'état, vous pouvez utiliser make_response:

from flask import jsonify, make_response

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

Inspiration tirée de ce commentaire dans le traqueur de problème Flask.

5
rouble

Avant Flask 0.11, jsonfiy ne permettait pas le retour direct d'un tableau. À la place, transmettez la liste en tant qu'argument de mot clé.

@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

Si vous devez renvoyer une réponse json pour mettre en œuvre une api de repos, vous pouvez utiliser flask-reposful ( https://flask-restful.readthedocs.io/en/latest/quickstart.html ). Je pense que cette solution est plus simple, plus résistante et en quelque sorte plus élégante.

Voici leur démarrage rapide:

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