【问题标题】:Django clear cache for only detail viewDjango清除缓存仅用于详细视图
【发布时间】:2015-09-17 12:22:04
【问题描述】:

我通过 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())) 

但是生成的hash和redis缓存中的hash不一样。 我应该使用什么来仅为我更新的对象清除缓存?

【问题讨论】:

    标签: python django caching


    【解决方案1】:

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

    如果您想知道如何计算十六进制摘要,请查看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 是您尝试清除缓存的语言的语言代码。如果你想为所有语言做这件事,你必须循环做。

    【讨论】:

      【解决方案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)
      

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

      【讨论】:

      • 谢谢!它可以工作,但函数应该像这样使用:make_template_fragment_key('object_detail', (obj.id, settings.LANGUAGE_CODE))
      猜你喜欢
      • 1970-01-01
      • 2017-04-10
      • 2018-02-12
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多