首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整洁地显示Flask返回的JSON

整洁地显示Flask返回的JSON
EN

Stack Overflow用户
提问于 2013-06-04 10:32:39
回答 2查看 39.2K关注 0票数 19

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

代码语言:javascript
复制
@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/时,输出如下所示:

代码语言:javascript
复制
[{ "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" }]

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-18 13:18:10

Flask提供jsonify()作为一种便利:

代码语言:javascript
复制
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的args作为JSON表示,并且,与您的代码不同,它将发送正确的Content-Type头:application/json。请注意文档中关于格式的说明:

如果JSONIFY_PRETTYPRINT_REGULAR配置参数设置为True,或者Flask应用程序在调试模式下运行,则

此函数的响应将被打印出来。压缩(不美观)格式目前意味着没有缩进和分隔符后没有空格。

当不处于调试模式时,响应将接收非漂亮打印的JSON。这应该不是问题,因为用于JavaScript消费的JSON应该不需要格式化(那只是要通过网络发送的额外数据),而且大多数工具都会自己格式化接收到的JSON。

如果你想继续使用json.dumps(),你可以通过返回一个带有current_app.response_class()Response来发送正确的mimetype。

代码语言:javascript
复制
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")

有关差异的更多信息,请参阅:

在Flask 1.0之前,JSON处理有所不同。jsonify将尝试检测请求是否为AJAX,如果不是,则返回打印得很好的结果;这将被删除,因为它不可靠。jsonify只允许将dicts作为security reasons的顶级对象;这在现代浏览器中不再适用。

票数 32
EN

Stack Overflow用户

发布于 2014-04-27 15:32:38

如果出于某种原因你需要重写flask.jsonify (例如,adding a custom json encoder),你可以使用下面的方法来实现上面提到的安全修复@phpmycoder:

代码语言:javascript
复制
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")

响应:

代码语言:javascript
复制
{
    "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"
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16908943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档