【问题标题】:App Engine ndb query to JSONApp Engine ndb 查询到 JSON
【发布时间】:2015-09-13 18:46:41
【问题描述】:

我希望通过 ndb 查询提取两个属性并将它们转换为 JSON。 当我使用 print response 时,这似乎有效,因为这将是结果:

[{"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)

【问题讨论】:

    标签: python json google-app-engine


    【解决方案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)
    

    列表推导首先建立一个字典列表。

    请注意,标题只需要设置一次,而不是实体列表中的每个对象。

    【讨论】:

    • 感谢Martijn的回复。我已在我的代码中对此进行了更新,但它仍在 JSON 文件的第一行输出 )]}',。但是,print data 仅在日志中显示有效的 JSON
    • 某些东西 else 正在产生它。注释掉json.dump() 电话,它仍然会在那里。
    • 您可以删除一半的方法,看看它是否仍然发生。如果没有,则删除另一半。将其缩小到导致此问题的部分。
    【解决方案2】:

    您正在使用的框架(在 response.out.write 中)添加了您看到的前缀,以实现 AngularJS json 安全漏洞解决方法(请参阅here)。

    我不确定是否有任何 python webapp 框架在编写响应时默认执行此操作;也许这是同事添加的?检查“response.out.write”方法的代码是否被覆盖。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多