我试图用flask创建一个简单的api。我现在要返回一个dicts列表,如下所示:
print results # prints out [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}]
response = make_response(jsonify(results))
response.headers['Content-Type'] = 'application/json'
return response
但是当我在浏览器中输入url时,我得到了以下信息:
{
"date": "title"
}
有人知道我做错了什么吗?欢迎所有小费!
最佳答案
这只是0.11之前的flask版本的问题;如果您仍然看到这个问题,最好的做法是升级到更高版本,因为0.10现在已经相当古老了。
对于0.10版之前的Flask,jsonify()
只接受字典。如果你给它一个列表,它会把对象变成一个字典,带有dict(argument)
。参见Flask.jsonify()
documentation:
用给定的参数的JSON表示创建一个Response
,使用一个application/json
MIMEType。这个函数的参数与DICT构造函数的参数相同。
(强调我的)
在您的例子中,您有一个包含一个元素的列表,而该元素在迭代时有两个值。这两个值随后成为输出字典的键和值:
>>> results = [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}]
>>> dict(results)
{'date': 'title'}
这是因为
dict()
构造函数要么接受另一个字典、关键字参数,要么接受(key, value)
对的iterable。解决办法是不要把清单交上来,但至少要给它一把钥匙:
response = jsonify(results=results)
jsonify()
已返回响应对象,无需对其调用make_response()
。上面的代码生成一个json对象,键为'results'
,值为list。jsonify()
出于安全原因,只需要字典。再次引用文档:出于安全原因,仅支持顶级对象。有关更多信息,请查看JSON Security。
如果您真的想绕过这个问题,您必须创建自己的响应:
from Flask import json
response = make_response(json.dumps(results), mimetype='application/json')