我正在使用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" }]我如何返回这个字典,以便每个键和值都在各自的行上?
发布于 2013-07-18 13:18:10
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的args作为JSON表示,并且,与您的代码不同,它将发送正确的Content-Type头:application/json。请注意文档中关于格式的说明:
如果JSONIFY_PRETTYPRINT_REGULAR配置参数设置为True,或者Flask应用程序在调试模式下运行,则
此函数的响应将被打印出来。压缩(不美观)格式目前意味着没有缩进和分隔符后没有空格。
当不处于调试模式时,响应将接收非漂亮打印的JSON。这应该不是问题,因为用于JavaScript消费的JSON应该不需要格式化(那只是要通过网络发送的额外数据),而且大多数工具都会自己格式化接收到的JSON。
如果你想继续使用json.dumps(),你可以通过返回一个带有current_app.response_class()的Response来发送正确的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")有关差异的更多信息,请参阅:
flask.json module docs在Flask 1.0之前,JSON处理有所不同。jsonify将尝试检测请求是否为AJAX,如果不是,则返回打印得很好的结果;这将被删除,因为它不可靠。jsonify只允许将dicts作为security reasons的顶级对象;这在现代浏览器中不再适用。
发布于 2014-04-27 15:32:38
如果出于某种原因你需要重写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"
}https://stackoverflow.com/questions/16908943
复制相似问题