我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
但是当我在浏览器中访问网址时,我得到以下信息:
{
"date": "title"
}
Run Code Online (Sandbox Code Playgroud)
有谁知道我在这里做错了什么?欢迎所有提示!
对于0.11之前的 Flask版本,这只是一个问题; 如果你仍然看到这个问题,最好的办法是升级到更高版本,因为0.10现在已经非常古老了.
对于最高版本0.10的Flask,jsonify()只接受字典.如果你给它一个列表,它会把对象变成一个字典,用dict(argument).查看Flask.jsonify()文档:
Response使用application/jsonmimetype 创建具有给定参数的JSON表示的a .此函数的参数与dict构造函数的参数相同.
(强调我的)
在您的情况下,您有一个包含一个元素的列表,并且该元素在迭代时具有2个值.这两个值然后成为输出字典的键和值:
>>> results = [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}]
>>> dict(results)
{'date': 'title'}
Run Code Online (Sandbox Code Playgroud)
那是因为dict()构造函数要么使用另一个字典,关键字参数或可迭代的(key, value)对.
解决方案是不传入列表,但至少给它一个键:
response = jsonify(results=results)
Run Code Online (Sandbox Code Playgroud)
jsonify()已经返回一个响应对象,没有必要调用make_response()它.上面生成一个带有'results'键的JSON对象,并将列表作为值.
jsonify()出于安全原因,只需要字典.再次引用文档:
出于安全原因,仅支持对象.有关此内容的更多信息,请查看JSON安全性.
如果你真的想绕过这个,你必须创建自己的回复:
from Flask import json
response = make_response(json.dumps(results), mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)