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