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

时间:2015-02-20 10:57:37

标签: python caching 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装饰器中的高速缓存中,仍然没有运气......

2 个答案:

答案 0 :(得分:5)

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

@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'

答案 1 :(得分:3)

NikitaBaksalyar的答案指向了正确的方向。我无法使其正常工作。页面代码给我# Write the dict pickle.dump(a, open("file", "wb")) # Read the dict a = pickle.load(open("file", "rb")) 的错误。

解决方案非常简单。使用make_response方法。

missing response

对于每页缓存控制设置:

from flask import make_response

默认缓存控制设置:

    @app.route('/profile/details', methods=['GET', 'POST'])
    def profile_details():
        ...<page specific logic>...
        response = make_response(render_template('profile-details.html'))
        response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
        response.headers['Pragma'] = 'no-cache'
        return response