Never cache Django sitemap or view url from urls.py


There is a quick hack on how to disable browser cache for Django view from the urls.py. Recently I had to tell Django not to cache sitemap urls. The Apache server where the app was hosted used cache on all Django urls by default so I had to quickly change this for the sitemap urls.

Import the Django never_cache decorator and use it as function wrapper instead of view decorator in the urls.py


- Go to your Django project and open the urls.py file
- Import the cache decorator
from django.views.decorators.cache import never_cache

- Use it as function wrapper instead of view decorator

...
urlpatterns = [
...
url(r'^about$', app.views.about, name='about'),
url(r'^sitemap\.xml$', never_cache(sitemap), {'sitemaps': sitemaps}, name='sitemap'),
url(r'^news-sitemap\.xml$', never_cache(sitemap), { 'sitemaps': {'news': NewsViewSitemap }, 'template_name': 'news_sitemap.html' }, name='news_sitemap'),

url(r'^rss/$', never_cache(RssSiteNewsFeed()), name='rss'),
url(r'^atom/$', never_cache(AtomSiteNewsFeed()), name='atom'),
....
]

If you go in the never_cache function source code you will see
def add_never_cache_headers(response):
"""
Adds headers to a response to indicate that a page should never be cached.
"""
patch_response_headers(response, cache_timeout=-1)
patch_cache_control(response, no_cache=True, no_store=True, must_revalidate=True)


It just adds Cache-Control: max-age=0, no-cache, no-store, must-revalidate header to a response to indicate that a page should never be cached as stated in the official documentation on this link.

Quick and easy!

Cheers

Posted on

Tags: Django, Python, Cache-Control, no-cache header, never cache Django sitemap, never_cache decorator

Comments