Django仅为详细视图清除缓存

时间:2015-09-17 12:22:04

标签: python django caching

我通过django缓存使用redis缓存后端和缓存模板。 我用模板标签

创建缓存
{% cache 43200 object_detail object_detail.pk request.LANGUAGE_CODE %}
{% endcache %}

在redis-cli中我看到像这样的smth

1) ":1:template.cache.object_detail.89484b14b36a8d5329426a3d944d2983"

我的缓存失效是在UpdateView中保存对象并执行此对象后执行的函数:

def clear_cache_block(obj):
    key = hashlib.md5()
    obj_pk = obj.pk
    key.update(str(obj))
    cache.delete_pattern('*object_detail.'+str(key.hexdigest())) 

但生成的哈希与redis缓存中的哈希不一样。 我应该使用什么来清除仅用于更新对象的缓存?

2 个答案:

答案 0 :(得分:2)

要反转缓存键,您需要用于生成该键的所有变量。 cache模板标记(here)使用函数make_template_fragment_key生成缓存密钥。

因此,您的缓存失效功能可能如下所示:

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

def clear_cache_block(obj):
    cache_key = make_template_fragment_key('object_detail', 
                                            (obj.id, settings.LANGUAGE_CODE))
    cache.delete_pattern(cache_key)

当然,如果您有更多语言,则需要迭代语言代码并使每种语言的缓存无效。

答案 1 :(得分:1)

负责为模板标记创建缓存键的函数是django.core.cache.utils.make_template_fragment_key。它将缓存片段名称作为第一个参数(在本例中为“object_detail”,并将第二个参数作为传递给缓存标记的所有其他参数(在本例中为object_detail.pkrequest.LANGUAGE_CODE)。它将返回完整的密钥格式:template.cache.__YOUR_CACHE_FRAGMENT_NAME__.__HEX_DIGEST_OF_FRAGMENT_NAME_AND_PARAMETERS

如果您想知道如何计算十六进制摘要,请检查source code

所以你的代码应该是这样的:

from django.core.cache.utils import make_template_fragment_key

def clear_cache_block(obj, lang):
    key = make_template_fragment_key('object_detail', (obj.id, lang))
    cache.delete_pattern(key)

其中key是您尝试清除缓存的语言的语言代码。如果要对所有语言执行此操作,则必须循环执行。