616

我有一个函数可以使用 Pandas 分析 CSV 文件并生成带有摘要信息的字典。我想将结果作为 Flask 视图的响应返回。如何返回 JSON 响应?

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

15 回答 15

937

从 Flask 1.1.0 开始,视图可以直接返回 Python dict,Flask 会jsonify自动调用。

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

如果您的 Flask 版本小于 1.1.0 或返回不同的 JSON 可序列化对象,请导入并使用jsonify.

from flask import jsonify

@app.route("/summary")
def summary():
    d = make_summary()
    return jsonify(d)
于 2012-10-26T15:33:57.280 回答
268

jsonify将您传递给 JSON 的数据序列化。如果您想自己序列化数据,请使用andjsonify构建响应来执行此操作。status=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
于 2014-11-16T20:16:47.473 回答
147

将关键字参数传递给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
}

如果你已经有一个 dict,你可以直接将它作为jsonify(d).

于 2012-10-26T06:11:55.313 回答
45

如果您由于某种原因不想使用jsonify,您可以手动执行它的操作。调用flask.json.dumps以创建 JSON 数据,然后返回具有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与内置json模块不同。如果可用,它将使用更快的simplejson模块,并启用与您的 Flask 应用程序的各种集成。

于 2018-01-23T19:54:04.117 回答
27

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

from flask import jsonify, make_response

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

灵感来自 Flask 问题跟踪器中的此评论

于 2019-05-22T22:02:22.480 回答
22

从版本 1.1.0 Flask 开始,如果视图返回一个 dict ,它将被转换为 JSON response

@app.route("/users", methods=['GET'])
def get_user():
    return {
        "user": "John Doe",
    }
于 2019-11-18T15:18:13.333 回答
17

如果你想分析用户上传的文件,Flask快速入门展示了如何从用户那里获取文件并访问它们。从中获取文件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'将for 的键替换为request.filesHTML 表单中输入的文件名。

于 2013-12-05T16:44:35.217 回答
13

Flask 1.1.x 支持在不调用jsonify. 如果你想返回一个字典以外的东西,你仍然需要调用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

于 2020-05-14T08:32:56.537 回答
12

我使用装饰器返回jsonfiy. 我认为当一个视图有多个返回时它更具可读性。这不支持返回像 一样的元组content, status,但我用它来处理返回错误状态app.errorhandler

import functools
from flask import jsonify

def return_json(f):
    @functools.wraps(f)
    def inner(**kwargs):
        return jsonify(f(**kwargs))

    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 'none of them'
于 2016-06-10T13:37:31.097 回答
5

在 Flask 0.11 之前,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)
于 2016-06-26T15:42:58.877 回答
5

在 Flask 1.1 中,如果你返回一个字典,它会自动转换成 JSON。所以如果make_summary()返回一个字典,你可以

from flask import Flask

app = Flask(__name__)

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

询问包含状态代码的SO已作为副本关闭。因此,为了回答这个问题,您可以通过返回表单的元组来包含状态代码(dict, int)。将dict转换为 JSON,并且int将是 HTTP 状态代码。在没有任何输入的情况下,Status 是默认的 200。因此在上面的示例中,代码将为 200。在下面的示例中,它更改为 201。

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d, 201  # 200 is the default

您可以使用检查状态代码

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
于 2020-01-03T14:37:43.230 回答
1

如果它是一个字典,flask 可以直接返回它(版本 1.0.2)

def summary():
    d = make_summary()
    return d, 200
于 2019-12-03T14:15:15.943 回答
1

使用 Flask 的基于类的视图时,答案是一样的。

from flask import Flask, request, jsonify
from flask.views import MethodView

app = Flask(__name__)

class Summary(MethodView):
    def get(self):
        d = make_summary()
        return jsonify(d)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))
于 2019-10-24T11:40:41.173 回答
0

要序列化对象,请使用jsonifyfromflask模块对对象进行 jsonify,默认情况下会序列化字典。此外,如果您正在处理文件,您可以随时使用make_response.

于 2021-11-12T10:49:35.727 回答
-2

我喜欢这种方式:

    @app.route("/summary")
    def summary():
        responseBody = { "message": "bla bla bla", "summary": make_summary() }
        return make_response(jsonify(responseBody), 200)
于 2020-09-16T13:58:58.930 回答