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

Alo*_*sai 11 python json flask

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

在浏览/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" }]
Run Code Online (Sandbox Code Playgroud)

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

Bai*_*ker 21

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)
Run Code Online (Sandbox Code Playgroud)

这将返回jsonify作为JSON表示的args ,并且,与您的代码不同,将发送正确的Content-Type标头:application/json.记下文档对格式的说法:

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

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

如果你想仍然使用json.dumps(),你可以通过返回发送正确的MIME类型Response使用current_app.response_class().

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")
Run Code Online (Sandbox Code Playgroud)

有关差异的更多信息:


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