你们在使用Flask静态文件的时候,每次更新,发现CSS或是Js或者其余的文件不会更新。css
这是由于浏览器的缓存问题。web
广泛你们是这几步解决办法。算法
@app.context_processor def override_url_for(): return dict(url_for=dated_url_for) def dated_url_for(endpoint, **values): if endpoint == 'static': filename = values.get('filename', None) if filename: file_path = os.path.join(app.root_path, endpoint, filename) values['q'] = int(os.stat(file_path).st_mtime) return url_for(endpoint, **values)
若是是我,我不会这么作,效率很低。数据库
这是 Flask的 config
的源码,里面能够看到,有设置缓存最大时间浏览器
SEND_FILE_MAX_AGE_DEFAULT
能够看到,它是一个 temedelta 的值缓存
咱们去更改配置。性能优化
第2行: 咱们引入了 datetime
的 timedelta
对象服务器
第6行: 咱们配置缓存最大时间app
这样就解决了缓存问题,不用去写多余的代码,不用去清理浏览器的缓存。ide
缓存机制无处不在,有客户端缓存,服务端缓存,代理服务器缓存等。在HTTP中具备缓存功能的是浏览器缓存。 HTTP缓存做为web性能优化的重要手段,对于从事web开发的朋友有重要的意义。本文将围绕如下几个方面来整理HTTP缓存:
咱们知道HTTP的缓存属于客户端缓存,后面会提到为何属于客户端缓存。因此咱们认为浏览器存在一个缓存数据库,用于储存一些不常常变化的静态文件(图片、css、js等)。咱们将缓存分为强制缓存和协商缓存。下面我将分别详细的介绍这两种缓存的缓存规则。
当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。
又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,获得标识后请求服务端验证是否失效(新鲜),若是没有失效服务端会返回304,此时客户端直接从缓存中获取所请求的数据,若是标识失效,服务端会返回更新后的数据。
两类缓存机制能够同时存在,强制缓存的优先级高于协商缓存,当执行强制缓存时,如若缓存命中,则直接使用缓存数据库数据,不在进行缓存协商。
上面的内容让咱们大概了解了缓存机制是怎样运行的,可是,服务器是如何判断缓存是否失效呢?咱们知道浏览器和服务器进行交互的时候会发送一些请求数据和响应数据,咱们称之为HTTP报文。报文中包含首部header和主体部分body。与缓存相关的规则信息就包含在header中。boby中的内容是HTTP请求真正要传输的部分。举个HTTP报文header部分的例子以下:
对于强制缓存,服务器响应的header中会用两个字段来代表——Expires和Cache-Control。
Exprires的值为服务端返回的数据到期时间。当再次请求时的请求时间小于返回的此时间,则直接使用缓存数据。但因为服务端时间和客户端时间可能有偏差,这也将致使缓存命中的偏差,另外一方面,Expires是HTTP1.0的产物,故如今大多数使用Cache-Control替代。
Cache-Control有不少属性,不一样的属性表明的意义也不一样。 private:客户端能够缓存 public:客户端和代理服务器均可以缓存 max-age=t:缓存内容将在t秒后失效 no-cache:须要使用协商缓存来验证缓存数据 no-store:全部内容都不会缓存。
协商缓存须要进行对比判断是否可使用缓存。浏览器第一次请求数据时,服务器会将缓存标识与数据一块儿响应给客户端,客户端将它们备份至缓存中。再次请求时,客户端会将缓存中的标识发送给服务器,服务器根据此标识判断。若未失效,返回304状态码,浏览器拿到此状态码就能够直接使用缓存数据了。 对于协商缓存来讲,缓存标识咱们须要着重理解一下,下面咱们将着重介绍它的两种缓存方案。
Last-Modified: 服务器在响应请求时,会告诉浏览器资源的最后修改时间。
if-Modified-Since: 浏览器再次请求服务器的时候,请求头会包含此字段,后面跟着在缓存中得到的最后修改时间。服务端收到此请求头发现有if-Modified-Since,则与被请求资源的最后修改时间进行对比,若是一致则返回304和响应报文头,浏览器只须要从缓存中获取信息便可。 从字面上看,就是说:从某个时间节点算起,是否文件被修改了
if-Unmodified-Since: 从字面上看, 就是说: 从某个时间点算起, 是否文件没有被修改
这两个的区别是一个是修改了才下载一个是没修改才下载。 Last-Modified 说好却也不是特别好,由于若是在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会由于Last-Modified时间匹配不上而返回了整个实体给客户端(即便客户端缓存里有个如出一辙的资源)。为了解决这个问题,HTTP1.1推出了Etag。
Etag: 服务器响应请求时,经过此字段告诉浏览器当前资源在服务器生成的惟一标识(生成规则由服务器决定)
If-None-Match: 再次请求服务器时,浏览器的请求报文头部会包含此字段,后面的值为在缓存中获取的标识。服务器接收到次报文后发现If-None-Match则与被请求资源的惟一标识进行对比。
可是实际应用中因为Etag的计算是使用算法来得出的,而算法会占用服务端计算的资源,全部服务端的资源都是宝贵的,因此就不多使用Etag了。