我的Flask应用程序托管在Heroku上,由Nginx提供服务,并使用Cloudflare作为CDN。有时我会通过在Heroku上部署进行更改来更改静态资产(图像、CSS、JS等)。除非客户端手动清除其缓存,否则这些更改不会在客户端浏览器上发生变化。缓存将按推荐每个月在客户端浏览器上过期,但我希望在每次我部署到Heroku并在客户端加载/重新加载我的网站后,后端能够手动告诉客户端浏览器清除其缓存。是否有一种方法可以自动化此过程?
import os
from some_app import app
@app.template_filter('autoversion')
def autoversion_filter(filename):
# determining fullpath might be project specific
fullpath = os.path.join('some_app/', filename[1:])
try:
timestamp = str(os.path.getmtime(fullpath))
except OSError:
return filename
newfilename = "{0}?v={1}".format(filename, timestamp)
return newfilename
参考https://ana-balica.github.io/2014/02/01/autoversioning-static-assets-in-flask/
不要在静态资源URL中包含查询字符串。因为大多数代理都不会缓存带有查询参数的静态文件。因此,这会增加带宽,因为每次请求时都需要下载所有资源。
“要启用代理缓存这些资源,请从对静态资源的引用中删除查询字符串,并将参数编码到文件名中。” 但这意味着需要稍微不同的实现 :)