tornado中计算etag的一个BUG

Comments(0)


Posted on 2013-03-06 15:16:21 tornado


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

计算etag的代码如下:

def compute_etag(self):
    """Computes the etag header to be used for this request.

    May be overridden to provide custom etag implementations,
    or may return None to disable tornado's default etag support.
    """
    hasher = hashlib.sha1()
    for part in self._write_buffer:
        hasher.update(part)
    return '"%s"' % hasher.hexdigest()

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

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

def post(self):
    username = self.get_argument("username")
    if not redis.UserManager.is_user_exists(username):
        self.set_secure_cookie("user", username)
        self.redirect("/room", status=301)
        return
    else:
        self.render("login.html", user_exists=True)

这段代码中,返回的内容永远不会有变化。 所以客户端判断返回为304,导致出现问题。 解决方法是禁用etag。解决方法很简单,只要重载compute_etag方法,并返回None即可。 并且建议,对于所有动态页面,不用计算etag的方法,这样可以让客户端永远获取最新的内容。 如果真的要客户端缓存页面,可以用Cache-Control,设置有效期,这样比较合理。

前一篇: 系统时间不对导致cookie设置不成功 后一篇: tornado长连接断开的处理机制

Captcha:
验证码

Email:

Content: (Support Markdown Syntax)