首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django只为详细信息视图清除缓存

Django只为详细信息视图清除缓存
EN

Stack Overflow用户
提问于 2015-09-17 12:22:04
回答 2查看 720关注 0票数 2

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

代码语言:javascript
复制
{% cache 43200 object_detail object_detail.pk request.LANGUAGE_CODE %}
{% endcache %}

在红葡萄酒里,我看到了这样的味道

代码语言:javascript
复制
1) ":1:template.cache.object_detail.89484b14b36a8d5329426a3d944d2983"

我的缓存失效是在UpdateView中保存对象并接受这个对象之后执行的函数:

代码语言:javascript
复制
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缓存中的散列不一样。应该使用什么来清除仅用于更新对象的缓存?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-17 12:45:12

负责为模板标记创建缓存键的函数是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

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

所以您的代码应该如下所示:

代码语言:javascript
复制
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)

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

票数 2
EN

Stack Overflow用户

发布于 2015-09-17 12:43:32

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

因此,缓存无效函数可能如下所示:

代码语言:javascript
复制
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)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32630217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档