最近在用Flask
写一个web
项目时碰到一个奇怪的现象(前端新手),修改css
文件时再浏览器前端刷新看不到修改的结果,显示的依然是修改前的效果,
久久不能理解,Google
一番之后才明白这是因为浏览器缓存了css
文件的结果。一些方案说通过Ctrl + F5
强制浏览器刷新可以解决,试了一下的确可以
看到修改之后的效果,说明有效,但是这并不是一个根本的解决方案,继续搜索发现通过给css
文件的连接之后加一个动态的参数同样可以解决问题,如当前
系统的时间戳,或者css
文件的哈希值:
.../xxx.css?t=<时间戳>
.../xxx.css?h=<哈希值>
通过每次修改css
文件后产生一个变化的url
来让浏览器重新从server
端读取css
文件来解决缓存问题,我觉得这是更根本的解决方案,下面介绍一下如何来做。
- 计算
css
文件的哈希值 ``` import hashlib
def get_sha1(filename): “”” :param filename: css文件的路径 :return css文件的哈希值 “”” # 以二进制的方式打开文件进行读取,其它方式可能会在计算哈希值的时候出错 with open(filename, “rb”) as f: sha1obj = hashlib.sha1() sha1obj.update(f.read())
return sha1obj.hexdigest() ```
2 Jinja2
模板里面使用url_for
来获取css
文件的路径,再添加一个多余的参数它会自动作为css
文件url
的参数
# h=hashcode这个多余的参数会自动作为css文件的参数,最后个url格式为:xxx/static/css/style.css?h=xxx
<link href= rel="stylesheet" type="text/css" />
3 render_template
时将hashcode传递给Jinja2
模板,这里以访问根url
为例
@app.route("/")
def index():
return render_template("index.html", hashcode=get_sha1("static/css/style.css")[, ...])
OK,经过以上三步的改造,我们每次修改css
文件都会在浏览器端实时更新。