从 Flask 视图返回 JSON 响应

2024-11-22 08:47:00
admin
原创
198
摘要:问题描述:我有一个函数,它使用 Pandas 分析 CSV 文件并生成包含摘要信息的字典。我想将结果作为 Flask 视图的响应返回。如何返回 JSON 响应?@app.route("/summary") def summary(): d = make_summary() ...

问题描述:

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

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

解决方案 1:

视图可以直接返回 Python 字典或列表,Flask 将jsonify自动调用。

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

对于旧版本的 Flask,或者要返回不同的 JSON 可序列化对象,请导入并使用jsonify

from flask import jsonify

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

解决方案 2:

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

解决方案 3:

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

如果您已经有了一个字典,您可以直接将其作为传递jsonify(d)

解决方案 4:

如果出于某种原因您不想使用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 应用进行各种集成。

解决方案 5:

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

from flask import jsonify, make_response

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

灵感来自于Flask 问题跟踪器中的这条评论。

解决方案 6:

从 Flask 1.1.0 版本开始,如果视图返回一个字典,它将被转换成 JSON 响应。

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

解决方案 7:

如果你想分析用户上传的文件,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'将键替换request.files为 HTML 表单中输入的文件名。

解决方案 8:

Flask 1.1.x 支持无需调用 即可返回 JSON 字典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

解决方案 9:

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

解决方案 10:

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

from flask import Flask

app = Flask(__name__)

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

询问是否包含状态代码的 SO已关闭,因为它与此 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

您可以使用以下方式检查状态代码

curl --request GET "http://127.0.0.1:5000/summary" -w "
code: %{http_code}

"

解决方案 11:

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

解决方案 12:

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

解决方案 13:

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

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

解决方案 14:

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

解决方案 15:

我喜欢这种方式:

    @app.route("/summary")
    def summary():
        responseBody = { "message": "bla bla bla", "summary": make_summary() }
        return make_response(jsonify(responseBody), 200)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1572  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   0  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   0  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用