Chrome缓存从烧瓶下载(以及如何停止它)?



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

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

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

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

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

它变得更有趣了。

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

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

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

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

最有趣的是,即使完全关闭服务器,它仍然可以下载!!

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

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

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

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

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

此外,在 chrome 调试窗口中,您可以转到Network并查看响应来自何处(更多内容在这里)

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

好消息是,缓存将在某个时候过期(什么时候?

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

Cache-Control: no-cache

Cache-Control: max-age=0

这应该避免缓存。

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

最新更新