jsonify()
принимает только словари. Если вы дадите ему список, он превратит объект в словарь, с dict(argument)
. Смотрите Flask.jsonify()
documentation:
Создает Response
с представлением JSON из приведенных аргументов с application/json
MimeType. Аргументы этой функции такие же, как и для конструктора dict.
(выделено мной)
В вашем случае у вас есть список с одним элементом, и этот элемент, когда итерации, имеет 2 значения. Эти два значения становятся ключом и значения выходного словаря:
>>> results = [{'date': '2014-09-25 19:00:00', 'title': u'Some Title'}]
>>> dict(results)
{'date': 'title'}
Это потому, что dict()
конструктор либо принимает другой словарь, ключевые аргументы или итератора из (key, value)
пар.
Решение не миновать в списке, но дать его, по крайней мере, ключ:
response = jsonify(results=results)
jsonify()
уже возвращает объект ответа, нет необходимости вызывать make_response()
на него. Вышеописанное создает объект JSON с ключом 'results'
и ваш список как значение.
jsonify()
принимает только словарь по соображениям безопасности. Повторное цитирование документации:
По соображениям безопасности поддерживаются только объекты. Для получения дополнительной информации об этом см. JSON Security.
Если вы действительно хотите, чтобы обойти это, вы должны создать свой собственный ответ:
from Flask import json
response = make_response(json.dumps(results), mimetype='application/json')
Ач , в этом есть смысл. Но что, если я действительно хочу предоставить список, а не словарь? Разве не просто API-интерфейсы просто возвращать список объектов? – kramer65
@ kramer65: API обычно обертывают списки объектов в объекте по соображениям безопасности. Я обновил ответ со ссылками и как обойти это, если вы хотите игнорировать совет. –
@ kramer65 'import json; json.dumps (results) ', затем make_response на этом – metaperture