2015-09-13 3 views
0

Я ищу, чтобы извлечь два свойства через запрос ndb и преобразовать их в JSON. Это похоже на работу, когда я использую print response, как это будет результат:App Engine ndb запрос к JSON

[{"LogTime": "2015-09-13T13:26:44.225394Z", "Temp": 40}] 

Однако, когда я затем использовать self.response.out.write.response добавляет случайные символы в начале файла JSON, который означает JSON не является действительным.

)]}', 
[{"LogTime": "2015-09-13T13:26:44.225394Z", "Temp": 40}] 

Я добавил основную часть своего кода ниже, поэтому, надеюсь, можно увидеть какие-либо вопиющие ошибки!

entities = OutsideTemp.query().order(-OutsideTemp.LogTime).fetch(1, projection=[OutsideTemp.Temp, OutsideTemp.LogTime]) 
for entity in entities: 
    self.response.headers['Content-Type'] = 'application/json' 
    obj = { 
      'LogTime': str(entity.LogTime), 
      'Temp': entity.Temp 
      } 

    response = obj 

print response 
self.response.out.write(response) 

ответ

1

Префикс, который вы видите, добавляется каркасом, который вы используете (в response.out.write), для реализации обходной уязвимости уязвимости AngularJS json (см. here).

Я не уверен в какой-либо системе pappon webapp, которая делает это по умолчанию при написании ответов; возможно, это было добавлено коллегой? Проверьте, что код для метода response.out.write не был переопределен.

+0

Вы правы. Я использовал Google Scaffold здесь: https://github.com/google/gae-secure-scaffold-python и есть префикс в handlers.py Спасибо! – mrbiscuits

1

Вы не производите производство JSON вообще. Используйте json.dump() для получения JSON, имея это написать непосредственно к self.response.out объекту:

data = [{'LogTime': str(entity.LogTime), 'Temp': entity.Temp} 
     for entity in entities] 
self.response.headers['Content-Type'] = 'application/json' 
json.dump(data, self.response.out) 

Список постижение строит список словарей первым.

Обратите внимание, что заголовки должны быть установлены только один раз, а не для каждого объекта в списке объектов.

+0

Спасибо за ответ Martijn. Я обновил это в своем коде, но он все равно выводит ')]} ',' в первую строку файла JSON. Тем не менее, 'print data' показывает только действительный JSON в журналах – mrbiscuits

+0

Что-то * else * производит это. Прокомментируйте вызов 'json.dump()' и он все равно будет там. –

+0

Вы можете удалить половину своего метода и посмотреть, все ли это происходит. Затем удалите другую половину, если это не так. Ограничьте его до той части, которая вызывает это. –

Смежные вопросы