从Flask视图返回JSON响应

时间:2012-10-26 05:56:47

标签: python json flask

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

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

19 个答案:

答案 0 :(得分:592)

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

from flask import jsonify

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

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

答案 1 :(得分:163)

jsonify将您传递给JSON的数据序列化。如果您想自己序列化数据,请使用jsonifystatus=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

答案 2 :(得分:105)

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

答案 3 :(得分:23)

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

答案 4 :(得分:16)

如果您想分析用户上传的文件,Flask quickstart会显示如何从用户获取文件并访问它们。从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'的{​​{1}}键替换为HTML表单中输入文件的名称。

答案 5 :(得分:7)

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

def return_json(view):
    @functools.wraps(view)
    def wrapped_view(**values):
        return jsonify(view(**values))
    return wrapped_view


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

答案 6 :(得分:5)

烧瓶1.1.x

现在Flask支持请求直接返回json, jsonify 不再需要

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

等同于

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

有关更多信息,请点击此处https://medium.com/octopus-wealth/returning-json-from-flask-cf4ce6fe9aebhttps://github.com/pallets/flask/pull/3111

答案 7 :(得分:4)

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

答案 8 :(得分:2)

在Flask 1.1中,如果返回字典,它将自动转换为JSON。因此,如果make_summary()返回字典,则可以

from flask import Flask

app = Flask(__name__)

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

SO that asks about including the status code已作为与此副本的副本被关闭。因此,为了回答该问题,您可以通过返回格式为(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

您可以使用

检查状态码
curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"

答案 9 :(得分:2)

从1.1.0 Flask版本if a view returns a dict it will be turned into a JSON response开始。

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

答案 10 :(得分:1)

要返回JSON化的响应, 状态码,您可以执行以下操作:

from flask import jsonify, make_response

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

bug对烧瓶的启发

答案 11 :(得分:0)

我喜欢这种方式:

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

答案 12 :(得分:0)

from flask import jsonify
app = Flask(__name__)
@app.route('/summary')
def summary():

   d = make_summary()
   return jsonify(d)

答案 13 :(得分:0)

Python Flask JSON:

from flask import Flask, jsonify,request,json


app = Flask(__name__)



country = [
            {'name':'india'},
            {'name':'pakistian'},
            {'name':'US'},
            {'name':'UK'},
            {'name':'NZ'}
            ]


@app.route('/', methods=['GET'])
def test():

    return jsonify({
        'message': 'Hai'
    })



@app.route('/country', methods=['GET'])
def countryall():

    return jsonify({

        'country':country
    })


if __name__ == '__main__':
    app.run(debug=True, port=8080)

答案 14 :(得分:0)

如果您需要返回json响应以实现rest api,则可以使用flask-restful(https://flask-restful.readthedocs.io/en/latest/quickstart.html)。 我相信此解决方案更简单,更具弹性,并且在某种程度上更优雅。

这是他们的快速入门:

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
    app.run(debug=True)

答案 15 :(得分:-1)

“”“ 使用Flask基于类的视图 “”“

从烧瓶导入烧瓶,请求,jsonify

从flask.views导入MethodView

app = Flask( __ name __

app.add_url_rule('/ summary /',view_func = Summary.as_view('summary'))

类摘要(MethodView):

    def __init__(self):
        self.response = dict()

    def get(self):
        self.response['summary'] = make_summary()  # make_summary is a method to calculate the summary.
        return jsonify(self.response)

答案 16 :(得分:-1)

如果是字典,则烧瓶可以直接将其返回(版本1.0.2)

def summary():
    d = make_summary()
    return d, 200

答案 17 :(得分:-3)

如前所述,jsonify是最好的方法,或者您也可以在https://github.com/Parkayun/flask-responses

使用 Flask-responses '包
@app.route("/json")
def hello():
    return json_response(your_dict, status_code=201)

答案 18 :(得分:-4)

您可以尝试这种方法:

from flask import jsonify, Flask

app = Flask(__name__)

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