Skip to content

Instantly share code, notes, and snippets.

@dpnova
Created September 17, 2011 13:26
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save dpnova/1223933 to your computer and use it in GitHub Desktop.
Save dpnova/1223933 to your computer and use it in GitHub Desktop.
invalidate cache_page entries in django
def expire_view_cache(view_name, args=[], namespace=None, key_prefix=None, method="GET"):
"""
This function allows you to invalidate any view-level cache.
view_name: view function you wish to invalidate or it's named url pattern
args: any arguments passed to the view function
namepace: optioal, if an application namespace is needed
key prefix: for the @cache_page decorator for the function (if any)
from: http://stackoverflow.com/questions/2268417/expire-a-view-cache-in-django
added: method to request to get the key generating properly
"""
from django.core.urlresolvers import reverse
from django.http import HttpRequest
from django.utils.cache import get_cache_key
from django.core.cache import cache
from django.conf import settings
# create a fake request object
request = HttpRequest()
request.method = method
if settings.USE_I18N:
request.LANGUAGE_CODE = settings.LANGUAGE_CODE
# Loookup the request path:
if namespace:
view_name = namespace + ":" + view_name
request.path = reverse(view_name, args=args)
# get cache key, expire if the cached item exists:
key = get_cache_key(request, key_prefix=key_prefix)
if key:
if cache.get(key):
cache.set(key, None, 0)
return True
return False
@dpnova
Copy link
Author

dpnova commented Oct 8, 2011

That makes a lot of sense.. and now totally explains the weirdness I originally say. I think language code was being included unconditionally before and I removed that to get it working for me. Thanks a lot Patrick!

@sehmaschine
Copy link

great. this function is simple and awesome – it totally saved my day/week. IMHO, this should be part of djangos core.

@avances123
Copy link

I cant get this to work with redis, my keys in the db are:

redis 127.0.0.1:6379[3]> keys *
1) ":1:views.decorators.cache.cache_page..GET.3ea110fe325fa79fc1c57f03f06bc7b4.d41d8cd98f00b204e9800998ecf8427e.es.Europe/Madrid"
2) ":1:views.decorators.cache.cache_header..3ea110fe325fa79fc1c57f03f06bc7b4.es.Europe/Madrid"

The get_cache_key returns nothing, im using other cache than default ([3]) called "users"

@lxstar
Copy link

lxstar commented Aug 8, 2016

test in django==1.8.14, get_cache_key with request. require META["SERVER_NAME"] and META["SERVER_PORT"].

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment