Blog·Leo LiABOUT

Flask - 修改css文件不生效问题原因及解决方法

11 Apr 2018

最近在用Flask写一个web项目时碰到一个奇怪的现象(前端新手),修改css文件时再浏览器前端刷新看不到修改的结果,显示的依然是修改前的效果, 久久不能理解,Google一番之后才明白这是因为浏览器缓存了css文件的结果。一些方案说通过Ctrl + F5强制浏览器刷新可以解决,试了一下的确可以 看到修改之后的效果,说明有效,但是这并不是一个根本的解决方案,继续搜索发现通过给css文件的连接之后加一个动态的参数同样可以解决问题,如当前 系统的时间戳,或者css文件的哈希值:

.../xxx.css?t=<时间戳>
.../xxx.css?h=<哈希值>

通过每次修改css文件后产生一个变化的url来让浏览器重新从server端读取css文件来解决缓存问题,我觉得这是更根本的解决方案,下面介绍一下如何来做。

  1. 计算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文件都会在浏览器端实时更新。