我有一个功能,用Pandas分析CSV文件,并生成一个包含摘要信息的dict . 我想将结果作为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可序列化类型(不仅仅是dict)作为顶级对象传递 .
jsonify 将您传递给JSON的数据序列化 . 如果您想自己序列化数据,请通过使用 status=200 和 mimetype='application/json' 构建响应来执行 jsonify 所做的操作 .
jsonify
status=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
将关键字参数传递给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 }
如果您由于某种原因不想使用 jsonify ,则可以手动执行此操作 . 调用 flask.json.dumps 以创建JSON数据,然后返回具有 application/json 内容类型的响应 .
flask.json.dumps
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 quickstart会显示如何从用户获取文件并访问它们 . 从 request.files 获取文件并将其传递给摘要函数 .
request.files
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')
将 'data' 的 'data' 键替换为HTML表单中输入文件的名称 .
'data'
您可以编写一个装饰器,将视图函数的返回值转换为JSON响应 .
def return_json(view): @functools.wraps(view) def wrapped_view(**values): return jsonify(view(**values)) return wrapped_view @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'
在Flask 0.11之前, jsonfiy 不允许直接返回数组 . 而是将列表作为关键字参数传递 .
jsonfiy
@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)
如前所述,jsonify是最好的方法,或者您也可以在https://github.com/Parkayun/flask-responses使用 Flask-responses '包
@app.route("/json") def hello(): return json_response(your_dict, status_code=201)
8 回答
将摘要数据传递给jsonify函数,该函数返回JSON响应 .
从Flask 0.11开始,您可以将任何JSON可序列化类型(不仅仅是dict)作为顶级对象传递 .
jsonify
将您传递给JSON的数据序列化 . 如果您想自己序列化数据,请通过使用status=200
和mimetype='application/json'
构建响应来执行jsonify
所做的操作 .将关键字参数传递给flask.jsonify,它们将作为JSON对象输出 .
如果您由于某种原因不想使用
jsonify
,则可以手动执行此操作 . 调用flask.json.dumps
以创建JSON数据,然后返回具有application/json
内容类型的响应 .如果要分析用户上传的文件,Flask quickstart会显示如何从用户获取文件并访问它们 . 从
request.files
获取文件并将其传递给摘要函数 .将
'data'
的'data'
键替换为HTML表单中输入文件的名称 .您可以编写一个装饰器,将视图函数的返回值转换为JSON响应 .
在Flask 0.11之前,
jsonfiy
不允许直接返回数组 . 而是将列表作为关键字参数传递 .如前所述,jsonify是最好的方法,或者您也可以在https://github.com/Parkayun/flask-responses使用 Flask-responses '包