繁体   English   中英

Django 通过信号使模板缓存失效

[英]Django invalidate template cache by signal

在 Django 模板中,我有复合缓存键变量:

{% with video.id|to_str as video_id  %}
    {% with 'cm'|add:"video"|add:video_id as tmpl_key %}
        {% cache 3600 * 24 tmpl_key %}
            {% include 'comments/index.html' with obj=video %}
        {% endcache %}
    {% endwith %}
{% endwith %}

此块缓存视频页面上的评论。

在信号上(在添加新评论时发生)我试图使缓存无效,如下所示:

@receiver(comment_was_posted)
def comment_was_posted_handler(sender, **kwargs):
    comment = kwargs['comment']
    cache_key = "cm" + str(comment.content_type) + str(comment.object_pk)
    key = make_template_fragment_key(cache_key)
    print(cache.get(key)) 
    cache.delete(key)

print(cache.get(key)) - 总是返回None (缓存失效失败,因为检索到的key没有任何缓存),但我确信缓存运行良好并且tmpl_key === cache_key是相等的。

我在make_template_fragment_key做错了吗?

无法将“复合缓存键”设置为连接字符串。 Django 模板引擎将时间部分之后的下一个符号视为“缓存键”字符串。

在我的问题中,它是符号“*”:

{% cache 3600 * 24 tmpl_key %}
    {% include 'comments/index.html' with obj=video %}
{% endcache %}

因此,django 将 '*' 视为缓存键,将 '24'、'tmpl_key' 视为不同的参数。


正确代码:

您需要像这样传递缓存参数:

{% cache 3600 video_comments video.id %}
    {% include 'comments/index.html' with obj=video %}
{% endcache %}

然后通过在make_template_fragment_key传递vary_on列表来使缓存无效

@receiver(comment_was_posted)
def comment_was_posted_handler(sender, **kwargs):
    comment = kwargs['comment']

    if str(comment.content_type) == "video":
        key = make_template_fragment_key('video_comments', [comment.object_pk])

我看不到您的代码中有任何错误,但您可以改进和简化它。 首先, make_template_fragment_keyvary_on动态PARAMS参数完全相同,因此您不必手动创建缓存键。

所以你会在你的模板中得到这样的东西:

{% cache 86400 cm video_content_type.id video.id %}
    {% include 'comments/index.html' with obj=video %}
{% endcache %}

...并在python中:

@receiver(comment_was_posted)
def comment_was_posted_handler(sender, **kwargs):
    comment = kwargs['comment']
    key = make_template_fragment_key('cm', vary_on=(comment.content_type.id, comment.object_pk))
    cache.delete(key)

唯一的变化是您需要另外将视频 content_type id 传递给您的模板(或至少对其进行硬编码),因为使用 content_type 名称不是一个好主意。

附注。 还! 我现在无法检查它,但我不确定像你所做的那样使用数学表达式是否合法,所以我用简单的秒数代替了它。

暂无
暂无

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

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