从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=200mimetype='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)