Clearing specific cache in Django
From django cache docs, it says that cache.delete('key')
should be enough. So, it comes to my mind two problems you might have:
Your imports are not correct, remember that you have to import
cache
from thedjango.core.cache
module:from django.core.cache import cache # ... cache.delete('my_url')
The key you're using is not correct (maybe it uses the full url, including "domain.com"). To check which is the exact url you can go into your shell:
$ ./manage.py shell >>> from django.core.cache import cache >>> cache.has_key('/post/1234/') # this will return True or False, whether the key was found or not # if False, keep trying until you find the correct key ... >>> cache.has_key('domain.com/post/1234/') # including domain.com ? >>> cache.has_key('www.domain.com/post/1234/') # including www.domain.com ? >>> cache.has_key('/post/1234') # without the trailing / ?
I make a function to delete key starting with some text. This help me to delete dynamic keys.
list posts cached
def get_posts(tag, page=1):
cached_data = cache.get('list_posts_home_tag%s_page%s' % (tag, page))
if not cached_data:
cached_data = mycontroller.get_posts(tag, page)
cache.set('list_posts_home_tag%s_page%s' % (tag, page), cached_data, 60)
return cached_data
when update any post, call flush_cache
def update(data):
response = mycontroller.update(data)
flush_cache('list_posts_home')
return response
flush_cache to delete any dynamic cache
def flush_cache(text):
for key in list(cache._cache.keys()):
if text in key:
cache.delete(key.replace(':1:', ''))
Do not forget to import cache from django
from django.core.cache import cache