【问题标题】:Chrome caching downloads from flask (and how to stop it)?Chrome 缓存从烧瓶下载的内容(以及如何阻止它)?
【发布时间】:2021-09-10 17:09:09
【问题描述】:

我在 Chrome 中观察到一个非常有趣的行为,而我在其他浏览器中没有观察到。

Chrome 似乎会在使用 Flask 托管的网络服务器上缓存来自同一 URL 的下载。例如:

@app.route('/download/<string:filename>')
def download(filename):
    send_file(filename)

基本上,如果我访问 localhost:3000/download/a_file.exe,那么 a_file.exe 就会被下载。

但是,问题是,如果我修改 a_file.exe(使其成为新的二进制文件),则会下载旧的二进制文件。任何文件格式都一样,真的。我最初是在尝试替换我尝试下载的图片(比如说 hi.jpg)时发现这个问题的。即使我将 hi.jpg 更改为新图片,旧图片也会被下载。

它变得更有趣了。

如果我从我的项目文件夹中删除文件 a_file.exe。理论上它应该抛出一个错误,对吧?不,即使文件不存在,仍然会下载旧的 a_file.exe。

如果我停止服务器,修改download()函数,重启服务器

@app.route('/download/<string:filename>)
def download(filename):
   print("hi")
   send_file(filename)

现在应该发生的是“hi”被打印出来,但它没有,这意味着 Chrome 基本上完全绕过了实际向服务器发送请求而只是给你文件。

最搞笑的是,即使完全关闭服务器,它还是会下载!!

严肃地说,这很成问题(至少对我而言),因为我的服务器本质上是在不断地修改同一个文件,基本上用户应该能够获得最新版本,而不仅仅是他们缓存的一些随机版本。

同样,这不会发生在其他浏览器上,例如 Edge(也使用 Chromium)。我已经测试了自己。

如果有任何不涉及更改文件名本身的解决方案(因为这可能会解决它,但对我来说实施起来有点问题),请告诉我。提前致谢。

【问题讨论】:

    标签: python google-chrome flask


    【解决方案1】:

    是的,chrome 具有非常强大的缓存。测试时,可以通过按CTRL+F5来绕过它,它是重新加载并避免缓存。

    您还可以通过查看服务器日志来判断您是否正在访问缓存,并查看端点是否被命中(类似于您打印 hi 所做的)。

    此外,在 chrome 调试窗口中,您可以转到 Network 并查看响应来自哪里 (more here)

    你能做些什么来避免这种情况?

    好消息,缓存将在某个时候过期 (When?)。

    或者,如果可以,您可以将Cache-Control 标头设置为

    Cache-Control: no-cache
    

    Cache-Control: max-age=0
    

    应该避免缓存。

    此外,如果缓存是您想要的行为,而不是在开发过程中(如果您想避免通过网络频繁传输文件,则可能是这种情况),您可以在 chrome as described here 中禁用缓存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2016-01-03
      • 2013-07-19
      • 1970-01-01
      • 2021-01-24
      相关资源
      最近更新 更多