一尘不染

使用Flask禁用特定页面上的缓存

flask

我有一个模板,显示作者可以编辑/删除的各种条目。用户可以单击“删除”来删除其帖子

删除后,用户将被重定向到条目页面,但该项目仍然存在,因此需要再次重新加载页面以显示删除效果。如果我禁用缓存,问题就会消失,但是我真的很想在所有其他页面中都拥有缓存…

添加这些标签无效,我认为我的浏览器只会忽略它们

<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" />

我启用缓存槽:

@app.after_request
def add_header(response):    
response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1'
response.headers['Cache-Control'] = 'public, max-age=600'
return response

有什么方法可以针对特定页面禁用它吗?

编辑

如建议,我尝试使用包装器:

def no_cache(f):
    def new_func(*args, **kwargs):
        resp = make_response(f(*args, **kwargs))
        resp.cache_control.no_cache = True
        return resp
    return update_wrapper(new_func, f)

并将需要的页面包装在@no_cache装饰器中,仍然没有运气…


阅读 1011

收藏
2020-04-06

共1个答案

一尘不染

仅当特定页面没有此类标题时,才可以尝试添加缓存控制标题:

@app.after_request
def add_header(response):    
  response.headers['X-UA-Compatible'] = 'IE=Edge,chrome=1'
  if ('Cache-Control' not in response.headers):
    response.headers['Cache-Control'] = 'public, max-age=600'
  return response

在你的页面代码中-例如:

@app.route('/page_without_cache')
def page_without_cache():
   response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
   response.headers['Pragma'] = 'no-cache'
   return 'hello'

重点是,你不应覆盖@app.after_request所有页面的标题-仅适用于未明确关闭缓存的页面。

此外,你可能希望将添加标头的代码移动到诸如@no_cache- 的包装器中,因此可以像这样使用它:

 @app.route('/page_without_cache')
 @no_cache
 def page_without_cache():
   return 'hello'
2020-04-06