zoukankan      html  css  js  c++  java
  • tornado中计算etag的一个BUG

    在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,设置有效期,这样比较合理。

  • 相关阅读:
    c# 使用Selenium模拟登录和操作数据的学习记录【续】
    c# 使用Selenium模拟登录和操作数据的学习记录
    使用bat一键安装mysql
    使用c#程序 添加iis网站目录的用户权限
    NOIp游记
    线规集合
    背包规划集合
    阴间扫描线
    11.30数学集合
    高精度运算
  • 原文地址:https://www.cnblogs.com/huazi/p/2946168.html
Copyright © 2011-2022 走看看