Hobhouse
Hobhouse

Reputation: 16293

How do I expire a django template cache key on receiving a signal?

In my front page template I use the cache function like this:

{% cache 86400 my_posts %}
    {% get_latest_posts %}
{% endcache %}

When there is a new post I would like to expire the cache key; like this:

def clear_post_cache():
    cache.delete('my_posts')

post_save.connect(clear_post_cache, sender=Post)

My problem is that the cache key isn't accessible as 'my_posts'. How do I find the key name?

Upvotes: 6

Views: 2472

Answers (3)

Yevgeniy Shchemelev
Yevgeniy Shchemelev

Reputation: 3651

from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

cache.delete(make_template_fragment_key('footer'))

Upvotes: 3

Jheasly
Jheasly

Reputation: 998

Note that the md5_constructor in the first line of Benjamin Wohlwend's example above is deprecated. Current (Nov. 2011) version is:

args = hashlib.md5(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]))

Upvotes: 3

Benjamin Wohlwend
Benjamin Wohlwend

Reputation: 31868

Have a look at how the cache key is constructed:

args = md5_constructor(u':'.join([urlquote(resolve_variable(var, context)) for var in self.vary_on]))
cache_key = 'template.cache.%s.%s' % (self.fragment_name, args.hexdigest())

The key is a combination of the fragment name (my_posts) and a md5 sum of additional arguments to the cache tag. Since you don't have additional arguments, the hexdigest is d41d8cd98f00b204e9800998ecf8427e (the md5 hash of the empty string). The cache key should therefore end up to be

template.cache.my_posts.d41d8cd98f00b204e9800998ecf8427e

If you need a more general solution, this snippet might help.

Upvotes: 16

Related Questions