从Flask视图返回JSON响应
我有一个function,分析与pandas的CSV文件,并产生与摘要信息的字典。 我想从Flask视图返回结果作为响应。 我如何返回一个JSON响应?
@app.route("/summary") def summary(): d = make_summary() # send it back as json
将摘要数据传递给jsonify
函数,该函数返回一个JSON响应。
from flask import jsonify @app.route('/summary') def summary(): d = make_summary() return jsonify(d)
从Flask 0.11开始,您可以将任何JSON序列化types(不仅仅是字典)作为顶级对象。
jsonify
序列化您传递给JSON的数据。 如果您想自己序列化数据,请执行jsonify
通过构buildstatus=200
和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
将关键字parameter passing给flask.jsonify
,它们将作为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 }
如果要分析用户上传的文件,Flask 快速入门将显示如何从用户获取文件并进行访问。 从request.files
获取文件并将其传递给汇总function。
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')
将request.files
的'data'
键replace为HTML表单中input的文件的名称。
尽pipeflask.jsonify
很容易使用,但我更喜欢使用装饰器来返回json。 它有助于返回任何jsontypes,并且在您的方法中有多个返回时更具可读性。 (注意,这个示例适用于200个响应,我通过引发exception和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'
虽然老问题,我想我会添加这个,如果有人想要返回一个JSON数组 。 Flask 0.10可以让你做到这一点,这非常简单。
@app.route('/get_records') def get_records(): list = [ { "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)
就像之前所说的,jsonify是最好的方法,或者你也可以使用Flask-responses的包https://github.com/Parkayun/flask-responses
@app.route("/json") def hello(): return json_response(your_dict, status_code=201)