我试图用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')

09-28 06:49