在使用tornado開發過程中總是遇到多次刷新頁面而頁面不更新的情況,目前可以採取的方法有:
1、重啓後端tornado服務
2、ctrl+F5強制刷新
3、按F12進入調試模式,在Network裏面選擇Disable cache,再刷新
4、在url後面加入參數(如:http://www.csdn.net/?v=1233123),當參數內容不重複時,瀏覽器就會無緩存刷新
5、通過閱讀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']
6、其實最好的方法是利用Tornado.web.Application的settings參數參數進行配置,設置debug=True或者static_hash_cache=False,具體寫到下面的方法中:
app = tornado.web.Application(
handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)],
debug=True
)
參考文獻:
https://blog.csdn.net/ljphilp/article/details/47103745
http://demo.pythoner.com/itt2zh/ch2.html
https://tornado-zh.readthedocs.io/zh/latest/guide/templates.html