在使用tornado开发过程中总是遇到多次刷新页面而页面不更新的情况,目前可以采取的方法有:
1、重启后端tornado服务
2、ctrl+F5强制刷新
3、按F12进入调试模式,在Network里面选择Disable cache,再刷新
4、在url后面加入参数(如:http://www.csdn.net/?v=1233123),当参数内容不重复时,浏览器就会无缓存刷新
通过阅读tornado中的StaticFileHandler源码以及大佬对StaticFileHandler分享的源码解析(https://www.cnblogs.com/ShaunChen/p/6636122.html 和 https://www.cnblogs.com/ShaunChen/p/6601242.html)可以发现在get方法有这样一个函数:
每次如果缓存存在的话就会设置304状态码,分析should_return_304函数,发现:
上半部分是每次在响应请求后就会将文件哈希值设置在ETag标签内,后端同时将ETag内容缓存在内存里,同一浏览器重复访问同一url时,就会把上次的ETag标签设置在请求报文的If-None-Match标签内,后端就会将If-None-Match与已缓存的ETag内容进行匹配,如果匹配成功就会返回304.
下半部分是每次在响应请求后后端将文件的修改时间设置在last-modified标签内,再次发送同样的请求后,浏览器将last-modified装入If-Modified-Since标签发送后,后端就会根据文件在系统的修改时间与If-Modified-Since作比较,如果不晚于的话就返回304
下半部分只要文件修改浏览器就不作缓存,对开发影响不大,但是上半部分由于ETag内容是缓存在内存中,不会随着文件修改而更新,所以要禁用ETag缓存,禁用方式有两种,一种是在响应报文中去掉ETag标签,另一种是在请求报文中去掉If-None-Match标签,修改代码如下:
class MyStaticFileHandler(tornado.web.StaticFileHandler):
def set_extra_headers(self, path):
self.clear_header('ETag')
class MyStaticFileHandler(tornado.web.StaticFileHandler):
def set_extra_headers(self, path):
del self.request.headers['If-None-Match']