I have a template showing various entries that the author can edit/delete. Users can delete their posts clicking on Delete
After the deletion the user gets redirected to the entries page, but the item is still there, and the page needs to be reloaded again to show the deletion effect. If i disable caching the problem disappears, but i really want to have caches in all the other pages...
adding these tags didn't work, i think my browser just ignores them
<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" />
I'm enabling the cache trough:
@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
Is there a way I can disable it for a specific page?
edit
as suggested i tried using a wrapper:
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)
and wrap the page i want wihtout cache in a @no_cache decorator, still had no luck...
Alternatively, you can right click on a page in Chrome, then click Inspect. Click on the Network tab, then check the box to Disable cache. You can then close out of Developer Tools. Bear in mind that this "Disable cache" will affect every single web page you browse.
To disable caching in Python Flask, we can set the response headers to disable cache. to create the add_header function that adds a few headers to the response after each request is done. We make it run after each request with the @app. after_request decorator.
To activate it you have to go to: More Tools > Developer tools > Network "tab" then click on Disable cache.
You can try adding cache control headers only if there are no such headers for a specific page:
@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
And in your page code - e.g.:
@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'
The point is that you shouldn't override your headers in @app.after_request
for all pages - only for those where cache isn't turned off explicitly.
Further, you might want to move the code adding headers to a wrapper such as @no_cache
- so you can use it just like that:
@app.route('/page_without_cache')
@no_cache
def page_without_cache():
return 'hello'
While the answer of NikitaBaksalyar is pointing into the right direction. I had trouble getting it to work. The page code gave me an error with missing response
.
The solution is quite simple. Use the make_response method.
from flask import make_response
For per page cache-control settings:
@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
Default cache-control settings:
@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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With