将应用部署到Heroku后,清除客户端浏览器缓存

7
我的Flask应用程序托管在Heroku上,由Nginx提供服务,并使用Cloudflare作为CDN。有时我会通过在Heroku上部署进行更改来更改静态资产(图像、CSS、JS等)。除非客户端手动清除其缓存,否则这些更改不会在客户端浏览器上发生变化。缓存将按推荐每个月在客户端浏览器上过期,但我希望在每次我部署到Heroku并在客户端加载/重新加载我的网站后,后端能够手动告诉客户端浏览器清除其缓存。是否有一种方法可以自动化此过程?
1个回答

3
如果您使用相同的文件名,它会使用缓存副本,那么为什么不使用过滤器对静态文件进行版本控制呢?您根本不需要更改文件名。但请确保阅读提供的链接中的注意事项。
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中包含查询字符串。因为大多数代理都不会缓存带有查询参数的静态文件。因此,这会增加带宽,因为每次请求时都需要下载所有资源。

“要启用代理缓存这些资源,请从对静态资源的引用中删除查询字符串,并将参数编码到文件名中。” 但这意味着需要稍微不同的实现 :)


那么,有哪些不同的实现方式,使得静态文件仍然可以带查询参数被缓存? - nosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接