以简洁的方式显示从 Flask 返回的 JSON

Posted

技术标签:

【中文标题】以简洁的方式显示从 Flask 返回的 JSON【英文标题】:Display JSON returned from Flask in a neat way 【发布时间】:2013-05-30 07:46:57 【问题描述】:

我正在使用 Flask 创建一个 API,并具有以下代码:

@app.route('/<major>/')
def major_res(major):
    course_list = list(client.db.course_col.find("major": (major.encode("utf8", "ignore").upper())))
    return json.dumps(course_list, sort_keys=True, indent=4, default=json_util.default)

在浏览器中查看/csci/时,输出如下:

[ "course": "CSCI052", "description": "Fundamentals of Computer Science. A solid foundation in functional programming, procedural and data abstraction, recursion and problem-solving. Applications to key areas of computer science, including algorithms and complexity, computer architecture and organization, programming languages, finite automata and computability. This course serves the same role as HM 60 as a prerequisite for upper-division computer science courses at any of the Claremont Colleges. Prerequisite: 51.", "instructor": "Bull, Everett L.,, Jr.", "name": " Fundamentals of Computer Science", "number": 52, "school": "PO" ]

我如何返回这个字典,以便每个键和值都在自己的行上?

【问题讨论】:

【参考方案1】:

Flask 提供jsonify() 方便:

from flask import jsonify

@app.route("/<major>/")
def major_res(major):
    course_list = list(client.db.course_col.find("major": major.upper()))
    return flask.jsonify(**course_list)

这将返回 jsonify 的参数作为 JSON 表示形式,并且与您的代码不同,它将发送正确的 Content-Type 标头:application/json。请注意文档对格式的说明:

如果 JSONIFY_PRETTYPRINT_REGULAR 配置参数设置为 True 或 Flask 应用程序在调试模式下运行,此函数的响应将被很好地打印出来。压缩(不漂亮)格式目前意味着分隔符后没有缩进和空格。

在不处于调试模式时,响应将收到非漂亮打印的 JSON。这应该不是问题,因为 javascript 消费的 JSON 不需要被格式化(这只是通过线路发送的额外数据),并且大多数工具格式自己接收 JSON。

如果您仍想使用json.dumps(),可以通过返回Responsecurrent_app.response_class() 来发送正确的mimetype。

from flask import json, current_app

@app.route("/<major>/")
def major_res(major):
    course_list = list(client.db.course_col.find("major": major.upper() ))
    return current_app.response_class(json.dumps(course_list), mimetype="application/json")

有关差异的更多信息:

json.dumps vs flask.jsonify flask.json module docs

在 Flask 1.0 之前,JSON 处理有些不同。 jsonify 会尝试检测请求是否为 AJAX,如果不是则返回漂亮的打印;这被删除了,因为它不可靠。 jsonify 只允许 dicts 作为 security reasons 的***对象;这不再适用于现代浏览器。

【讨论】:

【参考方案2】:

如果由于某种原因您需要覆盖 flask.jsonify(例如,adding a custom json encoder),您可以使用以下方法实现 @phpmycoder 提到的安全修复:

from json import dumps
from flask import make_response

def jsonify(status=200, indent=4, sort_keys=True, **kwargs):
    response = make_response(dumps(dict(**kwargs), indent=indent, sort_keys=sort_keys))
    response.headers['Content-Type'] = 'application/json; charset=utf-8'
    response.headers['mimetype'] = 'application/json'
    response.status_code = status
    return response

@app.route('/<major>/')
def major_res(major):
    course = client.db.course_col.find("major": (major.encode("utf8", "ignore").upper()))
    return jsonify(**course)

@app.route('/test/')
def test():
    return jsonify(indent=2, sort_keys=False, result="This is just a test")

回复:


    "course": "CSCI052", 
    "description": "Fundamentals of Computer Science. A solid foundation in functional programming, procedural and data abstraction, recursion and problem-solving. Applications to key areas of computer science, including algorithms and complexity, computer architecture and organization, programming languages, finite automata and computability. This course serves the same role as HM 60 as a prerequisite for upper-division computer science courses at any of the Claremont Colleges. Prerequisite: 51.", 
    "instructor": "Bull, Everett L.,, Jr.", 
    "name": " Fundamentals of Computer Science", 
    "number": 52, 
    "school": "PO"

【讨论】:

由于只返回一门课程,因此您不需要列表。如果您有另一条路线返回多个课程,您可以这样做:courses = query.that.returns.listreturn jsonify(courses=courses)

以上是关于以简洁的方式显示从 Flask 返回的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

更简洁/优雅的方式来连接 fetch() 返回的 JSON 元素

flask的前后端交互方式

Flask 学习-8. jsonify返回中文没正常显示问题

Flask 学习-6. jsonify()返回JSON格式数据

如何从 Flask 返回不记名 JWT 令牌?

如何将 JSON 对象传递给 Flask 中的模板?