如何在googleappengine for Python上设置etag?

2024-04-25 20:57:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从googleappengine服务器提供一些JSON内容。我需要为内容提供一个ETAG,以便知道自从上次加载数据以来它是否发生了变化。然后我的应用程序将删除它的旧数据并使用新的JSON数据来填充它的视图。在

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

为响应设置etag的最佳实践是什么?我需要自己计算ETAG吗?或者这是一种让HTTP协议来实现这一点的方法?在


Tags: 数据self服务器视图json应用程序内容application
2条回答

你必须自己计算e-tag值。E-tags是只对应用程序有意义的不透明字符串。在

最佳实践是将决定JSON内容的所有输入变量(转换为字符串)串联起来;如果发生任何更改,将导致JSON输出发生更改的内容,都应该是其中的一部分。如果这些字符串中有任何不想公开的敏感信息,请改用MD5散列值。在

例如,在我管理的CMS应用程序中,首页有以下电子标签:

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

我们关心的输入变量已经用|符号连接成一个不透明的值,但是它确实代表了几个不同的输入值,例如最后修改的时间戳(数字)、浏览器接受的语言头、当前的视觉主题,以及从浏览器cookie中检索的内部UID(它决定了首页内容的上下文)。如果这些变量中的任何一个发生变化,那么页面可能会不同,缓存的副本也会过时。在

请注意,如果没有快速验证的手段,电子标签是无用的。客户机将它包含在If-None-Match请求头中,服务器应该能够根据当前变量快速重新计算e-tag头,并查看标记是否仍然是当前的。如果重新计算所需的时间与重新生成内容主体所需的时间相同,那么发送304 Not Modified响应而不是200 OK响应中的完整JSON主体只节省了一点带宽。在

如果您使用的是webapp2,它可以根据响应主体自动添加md5etag。在

self.response.md5_etag()

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

相关问题 更多 >