我有一个功能,分析一个CSV文件与熊猫和产生一个词典的摘要信息。我想从Flask视图返回结果作为响应。如何返回JSON响应?

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

当前回答

1.1瓶。x支持在不调用jsonify的情况下返回JSON字典。如果你想返回dict以外的东西,你仍然需要调用jsonify。

@app.route("/")
def index():
    return {
        "api_stuff": "values",
    }

等于

@app.route("/")
def index():
    return jsonify({
        "api_stuff": "values",
    })

查看添加了这个的拉请求:https://github.com/pallets/flask/pull/3111

其他回答

如果您想分析用户上传的文件,Flask快速入门展示了如何从用户获取文件并访问它们。从请求中获取文件。文件并将其传递给汇总函数。

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'键。在HTML表单中输入文件的名称。

在Flask 0.11之前,jsonfy不允许直接返回数组。相反,将列表作为关键字参数传递。

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

我喜欢这样:

    @app.route("/summary")
    def summary():
        responseBody = { "message": "bla bla bla", "summary": make_summary() }
        return make_response(jsonify(responseBody), 200)

视图可以直接返回Python字典或列表,Flask会自动调用jsonify。

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

对于较旧的Flask版本,或者要返回不同的json序列化对象,请导入并使用jsonify。

from flask import jsonify

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

要返回JSON响应并设置状态码,可以使用make_response:

from flask import jsonify, make_response

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

灵感来自这个评论在Flask问题跟踪器。