从Django的缓存中删除特定项目?

时间:2009-04-06 09:36:35

标签: python django caching memcached

我正在使用以memcached作为后端的网站范围缓存。我想在底层数据库对象更改时使缓存中的页面无效。

如果页面名称发生变化,那么我将使整个缓存无效(因为它会影响每个页面的导航。笨拙但足以满足我的需求。

如果只是页面内容发生了变化,那么我想使该页面的缓存无效。

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:5)

我没有对Django进行过很多缓存,但我认为你想要的是signals

您可以在基础对象上设置post_save信号,并让回调函数使缓存中的该页无效。

from django.core.signals import post_save
from django.core.cache import cache

def invalidate_cache(sender, **kwargs):
    # invalidate cache
    cache.delete(sender.get_absolute_url()) # or any other pertinent keys

post_save.connect(invalidate_cache, sender=UnderlyingModel)

这应该在更新时正确地从缓存中删除该项目。

答案 1 :(得分:4)

tghw的解决方案实际上不起作用,因为缓存键不是绝对路径。密钥是根据绝对路径和HTTP标头计算的。有关示例,请参阅this question