【问题标题】:How to set ETAGS on Google App Engine for Python?如何在 Google App Engine for Python 上设置 ETAGS?
【发布时间】:2012-11-14 11:00:34
【问题描述】:

我正在从 Google App Engine 服务器提供一些 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 协议执行此操作的方法?

【问题讨论】:

    标签: python json google-app-engine http-headers


    【解决方案1】:

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

    self.response.md5_etag()
    

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

    【讨论】:

    • 遗憾的是,这样的电子标签本质上是无用的,因为您必须重建整个响应体才能再次计算它。电子标签的目的是避免为了查看响应是否仍然新鲜而不得不这样做。
    • @MartijnPieters 消除重新生成响应的需要很有用,但减少从服务器发送到客户端的数据也会产生非常显着的影响。
    【解决方案2】:

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

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

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

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

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

    请注意,如果没有快速验证的方法,电子标签将毫无用处。客户端会将其包含在If-None-Match 请求标头中,服务器应该能够快速从当前变量重新计算电子标签标头并查看该标签是否仍然是最新的。如果重新计算所花费的时间与重新生成内容正文所用的时间相同,那么发送 304 Not Modified 响应而不是发送 200 OK 响应中的完整 JSON 正文只会节省一点带宽。

    【讨论】:

    • m = md5.new() json_dumps = json.dumps(helpers.to_dict(object,"content")) 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:现在你的电子标签和你的回复一样昂贵,你已经打败了它的目的。
    • 我只使用 ETag 来验证我是否必须更改存储在磁盘上的数据,因此对于服务器来说有多昂贵并不重要。
    • @Hakonbogen:所以您只使用电子标签将响应与在客户端的磁盘值匹配?然后只需将md5 存储在客户端,并在收到新响应时重新计算。您不需要电子标签,这不是电子标签的目的。
    • 在您的数据存储中有一个 last_changed 时间戳,并将 etag 设为时间戳或修订号。
    猜你喜欢
    • 2010-11-23
    • 2016-04-09
    • 2015-06-22
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多