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

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

当前回答

要序列化一个对象,使用flask模块中的jsonify来jsonify对象,默认情况下字典会被序列化。另外,如果你处理的是文件,你总是可以使用make_response。

其他回答

我使用装饰器返回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'

如果出于某种原因不想使用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

瓶。Json不同于内置的Json模块。如果可用,它将使用更快的simplejson模块,并支持与Flask应用程序的各种集成。

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

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

从Flask 1.1.0版本开始,如果视图返回dict,它将被转换为JSON响应。

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