@route('/locations', method='GET')
def get_location():
entity = db['locations'].find({'coordinate2d': {'$near': [37.871593, -122.272747]}}).limit(3)
if not entity:
abort(404, 'No nearby locations')
return entity
上述代码部分的响应是:
Error 500: Internal Server Error
Sorry, the requested URL 'http://localhost:8080/locations' caused an error:
Unsupported response type: <type 'dict'>
如何从mongo中获取该信息作为类型瓶可以作为JSON返回?
答案 0 :(得分:2)
完整的解决方案是将db游标转换为列表,手动设置响应类型+自定义编码返回值的组合
@route('/locations/:lat/:lng', method='GET')
def get_location(lat,lng):
response.content_type = 'application/json'
objdb = db.locations.find({'coordinate2d': {'$near': [lat,lng]}}, {'coordinate2d':bool(1)}).skip(0).limit(3)
entries = [entry for entry in objdb]
return MongoEncoder().encode(entries)
在我的情况下,产生这个:
[
{
"_id": "4f4201bb7e720d1dca000005",
"coordinate2d": [
33.02032100000006,
-117.19483074631853
]
},
{
"_id": "4f4201587e720d1dca000002",
"coordinate2d": [
33.158092999999994,
-117.350594
]
},
{
"_id": "4f42018b7e720d1dca000003",
"coordinate2d": [
33.195870000000006,
-117.379483
]
}
]
答案 1 :(得分:1)
根据关于瓶http://bottlepy.org/docs/dev/的文档提及,您必须从@route
装饰器返回字符串。您必须使用数据或字符串返回模板。
如果要生成json,则必须更改Content-Type
。
字典
如上所述,Python词典(或子类 它自动转换为JSON字符串并返回 将Content-Type标头设置为application / json的浏览器。 这使得实现基于json的API变得容易。其他数据格式 也支持json。请参阅tutorial-output-filter以了解 更多。
http://bottlepy.org/docs/dev/tutorial.html?highlight=json#generating-content
答案 2 :(得分:1)
当我尝试返回python列表时出现此错误。我认为它会转化为JSON,但它没有。它使它成为bottle.py中的行,它将处理iterables并在列表中找到第一个dict并抛出错误。
为了解决这个问题,我只是将我的列表嵌入到词典中。
return {'response': []}