tornado中计算etag的一个BUG

本文讨论了在使用Tornado框架处理动态与静态页面时,计算ETag可能导致静态页面缓存失效的问题。通过重载compute_etag方法并返回None来禁用ETag计算,确保客户端始终接收最新内容。同时建议使用Cache-Control来设置页面的有效期,以实现合理的缓存策略。

在tornado中是根据send buffer中的内容计算etag的,而这样对于一些只判断逻辑的页面会有问题。

计算etag的代码如下:

 1 def compute_etag(self):
 2     """Computes the etag header to be used for this request.
 3 
 4     May be overridden to provide custom etag implementations,
 5     or may return None to disable tornado's default etag support.
 6     """
 7     hasher = hashlib.sha1()
 8     for part in self._write_buffer:
 9         hasher.update(part)
10     return '"%s"' % hasher.hexdigest()

可以很清楚的看到,是根据self._writer_buffer中的内容计算etag,然后返回。

但是如果遇到下面的代码会出现问题:

1 def post(self):
2     username = self.get_argument("username")
3     if not redis.UserManager.is_user_exists(username):
4         self.set_secure_cookie("user", username)
5         self.redirect("/room", status=301)
6         return
7     else:
8         self.render("login.html", user_exists=True)

这段代码中,返回的内容永远不会有变化。 所以客户端判断返回为304,导致出现问题。 

解决方法是禁用etag。解决方法很简单,只要重载compute_etag方法,并返回None即可。

并且建议,对于所有动态页面,不用计算etag的方法,这样可以让客户端永远获取最新的内容。

如果真的要客户端缓存页面,可以用Cache-Control,设置有效期,这样比较合理。

 

 

转载于:https://www.cnblogs.com/huazi/archive/2013/03/06/2946168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值