37

我正在使用Bottle编写一个 API ,到目前为止这非常棒。但是,在尝试返回 JSON 数组时遇到了一个小障碍。这是我的测试应用程序代码:

from bottle import route, run

@route('/single')
def returnsingle():
    return { "id": 1, "name": "Test Item 1" }

@route('/containsarray')
def returncontainsarray():
    return { "items": [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }] }

@route('/array')
def returnarray():
    return [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]

run(host='localhost', port=8080, debug=True, reloader=True)

当我运行它并请求每条路由时,我会从前两条路由中得到我期望的 JSON 响应:

/单身的

{ id: 1, name: "Test Item 1" }

/包含数组

{ "items": [ { "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" } ] }

所以,我曾期望返回一个字典列表来创建以下 JSON 响应:

[ { "id": 1, "name": "Test Object 1" }, { "id": 2, "name": "Test Object 2" } ]

但是请求/array路由只会导致错误。我做错了什么,如何以这种方式返回 JSON 数组?

4

2 回答 2

81

Bottle 的 JSON 插件只希望返回 dicts - 而不是数组。存在与返回 JSON 数组相关的漏洞 - 例如,请参阅这篇关于 JSON 劫持的帖子

如果你真的需要这样做,可以这样做,例如

@route('/array')
def returnarray():
    from bottle import response
    from json import dumps
    rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
    response.content_type = 'application/json'
    return dumps(rv)
于 2012-09-06T06:33:10.177 回答
20

根据 Bottle 的 0.12 文档:

如上所述,Python 字典(或其子类)会自动转换为 JSON 字符串并返回到浏览器,其中 Content-Type 标头设置为 application/json。这使得实现基于 json 的 API 变得容易。也支持 json 以外的数据格式。请参阅教程输出过滤器以了解更多信息。

这意味着您不需要也不需要import json设置响应的 content_type 属性。

因此,代码大大减少:

@route('/array')
def returnarray():
    rv = [{ "id": 1, "name": "Test Item 1" }, { "id": 2, "name": "Test Item 2" }]
    return dict(data=rv)

Web 服务器返回的 JSON 文档如下所示:

{"data": [{"id": 1, "name": "Test Item 1"}, {"id": 2, "name": "Test Item 2"}]}
于 2015-10-12T02:40:29.460 回答