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

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

当前回答

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

from flask import jsonify, make_response

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

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

其他回答

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

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

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

如果您想分析用户上传的文件,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的基于类的视图时,答案是一样的。

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

在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"