在Flask中禁用缓存

55

我有一些缓存问题。 我在运行一个非常小的Web应用程序,它读取一个帧,将其保存到磁盘上,然后在浏览器窗口中显示它。

我知道,这可能不是最好的解决方案,但每次我使用相同的名称保存此读取的帧时,任何浏览器都会缓存它。

我尝试使用HTML元标记-没有成功:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

此外,我还尝试了这个(特定于Flask):

resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
resp.headers["Pragma"] = "no-cache"
resp.headers["Expires"] = "0"

这是我尝试修改resp头文件的方式:

r = make_response(render_template('video.html', video_info=video_info))

r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
r.headers["Pragma"] = "no-cache"
r.headers["Expires"] = "0"

谷歌浏览器和Safari都会进行缓存。

这里可能存在什么问题?

3个回答

83

好的,

最终使用了这个方法:

@app.after_request
def add_header(r):
    """
    Add headers to both force latest IE rendering engine or Chrome Frame,
    and also to cache the rendered page for 10 minutes.
    """
    r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    r.headers["Pragma"] = "no-cache"
    r.headers["Expires"] = "0"
    r.headers['Cache-Control'] = 'public, max-age=0'
    return r
如果您添加此内容,则该函数将在每个请求完成后调用。请参见这里
如果有人能为我解释一下为什么页面处理程序中的标题重写不起作用,我会很高兴。
谢谢。

你已告诉浏览器不要缓存包含video.html内容的响应。但你还需要让它不要缓存包含frame本身的响应。 - dirn
42
请注意,你在倒数第二行中覆盖了第一行的 r.headers["Cache-Control"]。因此,实际上你的响应只会将 Cache-Control 设置为 'public, max-age=0' - k-nut
12
相关内容:现在,使用Flask 1.0.2可以访问Response实例的底层cache_control对象,并将no_cache字段设置为True(以及其他相关字段),而不是手动指定标题。请参见 https://dev59.com/f2Ag5IYBdhLWcg3w1t_y#23115561。 - Gino Mempin
4
根据MDN文档,似乎只需要使用no-store,而且最好仅在设置Cache-Control时使用它:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control。也就是说,在服务器响应中使用`Cache-Control: no-store`来防止缓存。 - Nick Brady

43
如果你一直遇到同样的问题,即Flask没有看到JS和CSS文件中的更新,那是因为默认情况下,Flask的max-age值为12小时。你可以将其设置为0来解决这个问题,就像这样:

如果你一直遇到同样的问题,即Flask没有看到JS和CSS文件中的更新,那是因为默认情况下,Flask的max-age值为12小时。你可以将其设置为0来解决这个问题,就像这样:

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

请参考文档了解详情。


4
这是一个更简单的解决方案,我所需要做的就是: - Carson

4
在Python文件中使用 app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 的组合和进行强制刷新(command + shift + R)可以解决问题,因为Chrome会缓存静态文件。

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