从Flask视图返回JSON响应

Cod*_*nja 418 python json flask

我有一个功能,用Pandas分析CSV文件,并生成一个包含摘要信息的dict.我想将结果作为Flask视图的响应返回.如何返回JSON响应?

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

cod*_*eek 663

将摘要数据传递给jsonify函数,该函数返回JSON响应.

from flask import jsonify

@app.route('/summary')
def summary():
    d = make_summary()
    return jsonify(d)
Run Code Online (Sandbox Code Playgroud)

从Flask 0.11开始,您可以将任何JSON可序列化类型(不仅仅是dict)作为顶级对象传递.


scl*_*cls 181

jsonify序列化您传递给JSON的数据.如果您想自己序列化数据,请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
Run Code Online (Sandbox Code Playgroud)


zen*_*ngr 118

传递关键字参数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
    )
Run Code Online (Sandbox Code Playgroud)
{
    "username": "admin",
    "email": "admin@localhost",
    "id": 42
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*ley 27

如果您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
Run Code Online (Sandbox Code Playgroud)


Joe*_*icz 19

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

@app.route("/users", methods=['GET'])
def get_user():
    return {
        "user": "John Doe",
    }
Run Code Online (Sandbox Code Playgroud)


小智 16

如果要分析用户上载的文件,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')
Run Code Online (Sandbox Code Playgroud)

'data'密钥替换为request.filesHTML表单中输入文件的名称.


Sai*_*fee 10

Flask 1.1.x 支持在不调用jsonify. 如果你想返回 dict 以外的东西,你仍然需要调用jsonify.

@app.route("/")
def index():
    return {
        "api_stuff": "values",
    }
Run Code Online (Sandbox Code Playgroud)

相当于

@app.route("/")
def index():
    return jsonify({
        "api_stuff": "values",
    })
Run Code Online (Sandbox Code Playgroud)

请参阅添加此内容的拉取请求:https : //github.com/pallets/flask/pull/3111


ima*_*man 9

您可以编写一个装饰器,将视图函数的返回值转换为JSON响应.

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'
Run Code Online (Sandbox Code Playgroud)


rou*_*ble 9

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

from flask import jsonify, make_response

@app.route('/summary')
def summary():
    d = make_summary()
    return make_response(jsonify(d), 200)
Run Code Online (Sandbox Code Playgroud)

Flask问题跟踪器中此注释的启发。


Ste*_*ell 6

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

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d
Run Code Online (Sandbox Code Playgroud)

询问包含状态代码的 SO已作为与此的重复项关闭。因此,为了回答这个问题,您可以通过返回表单的元组来包含状态代码(dict, int)。将dict转换为 JSON,并将int成为 HTTP 状态代码。如果没有任何输入,状态为默认 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
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令检查状态代码

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
Run Code Online (Sandbox Code Playgroud)


小智 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)
Run Code Online (Sandbox Code Playgroud)