繁体   English   中英

Django清除缓存仅用于详细视图

[英]Django clear cache for only detail view

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

{% cache 43200 object_detail object_detail.pk request.LANGUAGE_CODE %}
{% endcache %}

在redis-cli中,我看到这样的东西

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缓存中的哈希值不同。 我应该使用什么来仅清除更新对象的缓存?

要反转缓存键,您需要用于生成该键的所有变量。 cache模板标记( 此处 )使用函数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)

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

负责为模板标签创建缓存键的函数是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完整密钥template.cache.__YOUR_CACHE_FRAGMENT_NAME__.__HEX_DIGEST_OF_FRAGMENT_NAME_AND_PARAMETERS

如果您想知道十六进制摘要的计算方式,请检查源代码

因此,您的代码应如下所示:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM