从Django缓存中删除特定项?

9
我正在使用memcached作为后端的站点全局缓存。当底层数据库对象更改时,我希望使缓存中的页面失效。
如果页面名称更改,则我将使整个缓存失效(因为它会影响每个页面上的导航)。笨拙但足以满足我的需求。
如果只是页面内容更改,则我想使该页面的缓存失效。
有没有一种简单的方法来实现这个功能?
2个回答

6
我在Django中没有做过太多的缓存,但我认为你想要的是信号
您可以在基础对象上设置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)

这样做可以在更新时正确地从缓存中移除该项。

我不知道cache.delete的用法。 sender.get_absolute_url()会返回正确的cache键吗?我没有看到任何有关站点缓存生成键的文档。 - Andy Baker
1
默认情况下,Django的缓存系统使用请求路径(例如,“/stories/2005/jun/23/bank_robbed/”)创建其缓存键。 - michuk

4

tghw的解决方案实际上并不起作用,因为缓存键不是绝对路径。该键是从绝对路径和HTTP头计算出来的。请参见此问题以获取示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接