2012-11-14 40 views
2

我正在从Google App Engine服务器提供一些JSON内容。我需要为ETAG提供内容,以了解自上次加载数据以来是否发生了更改。然后我的应用程序将删除其旧数据并使用新的JSON数据填充其视图。如何在Google App Engine for Python上设置ETAGS?

self.response.headers['Content-Type'] = "application/json; charset=utf-8" 
    self.response.out.write(json.dumps(to_dict(objects,"content"))) 

什么是最佳实践来设置响应的ETAG?我是否必须自己计算ETAG?或者它是一种让HTTP协议做到这一点的方法?

回答

4

如果您使用的是webapp2,它可以自动添加基于响应正文的md5 ETag。

self.response.md5_etag() 

http://webapp-improved.appspot.com/guide/response.html

+5

可惜这样的e-tag本质上是无用的,因为你必须重建整个响应体来重新计算它。电子标签的目的是为了避免必须这样做,只是为了查看响应是否仍然是新鲜的。 –

+3

@MartijnPieters删除重新生成响应的需求很有用,但减少从服务器发送到客户端的数据也可以产生非常显着的影响。 –

4

您必须自己计算电子标签值。电子标签是不透明的字符串,只对应用程序有意义。

最佳实践是将所有确定JSON内容的输入变量(转换为字符串)连接起来;任何如果发生变化都会导致JSON输出发生变化的东西应该是其中的一部分。如果这些字符串中有任何敏感内容,您不想公开这些值,请改用这些值的MD5哈希值。

例如,在我管理一个CMS应用,头版有以下电子标签:

|531337735|en-us;en;q=0.5|0|Eli Visual Theme|1|943ed3c25e6d44497deb3fe274f98a96|| 

,我们关心已经结合一个|符号为不透明值的输入变量,但它确实表示了几个不同的输入值,例如最后修改的时间戳(数字),浏览器接受的语言头文件,当前的视觉主题以及从浏览器cookie中检索的内部UID(并确定哪些上下文首页上的内容取自)。如果这些变量中的任何一个会发生变化,页面可能会有所不同,并且缓存的副本将会过时。

请注意,电子标签没有办法很快就无法验证。客户端会将其包含在If-None-Match请求标头中,服务器应该能够快速重新计算当前变量的电子标签头并查看标签是否仍然是最新的。如果重新计算的时间与重新生成内容主体的时间相同,则您只需在200 OK响应中保存发送304 Not Modified响应的一小段带宽,而不是完整的JSON主体。

+0

'米= md5.new() json_dumps = json.dumps(helpers.to_dict(对象, “内容”)) m.update(json_dumps) self.response.headers ['Content-Type'] =“application/json; charset = utf-8” self.response.headers ['ETag'] = m.digest() self.response.out.write(json_dumps)' – hakonbogen

+1

@ Hakonbogen:现在你的电子标签和你的回应一样贵,你已经击败了它的目的。 –

+0

我只使用ETag来验证是否必须更改磁盘上存储的数据,所以无论服务器的价格如何都无关紧要。 – hakonbogen

相关问题