问题是:我有博客应用程序,并且我将帖子输出视图缓存了 5 分钟。
@cache_page(60 * 5)
def article(request, slug):
...
但是,每当向帖子中添加新评论时,我想使缓存失效。
我想知道如何最好地做到这一点?
我见过this https://stackoverflow.com/questions/2268417/expire-a-view-cache-in-django相关问题,但它已经过时了。
这是我在寻找解决方案时遇到的第一个打击,而当前的答案并不是很有帮助,所以在大量研究 Django 的源代码之后,我有了这个问题的答案。
是的,您可以通过编程方式知道密钥,但这需要一些工作。
Django 的页面缓存通过引用来工作request
对象,特别是请求路径和查询字符串。这意味着对于具有不同查询字符串的页面的每个请求,您将拥有不同的缓存键。在大多数情况下,这不太可能成为问题,因为您想要缓存/无效的页面将是一个已知的字符串,例如/blog/my-awesome-year
,所以要使这个无效,你只需要使用 Django 的RequestFactory
:
from django.core.cache import cache
from django.test import RequestFactory
from django.urls import reverse
from django.utils.cache import get_cache_key
cache.delete(get_cache_key(RequestFactory().get("/blog/my-awesome-year")))
如果您的 URL 是固定值列表(即没有不同的查询字符串),那么您可以在此停止。但是,如果您有很多不同的查询字符串(例如?q=xyz
对于搜索页面或其他内容),那么最好的选择可能是为每个视图创建一个单独的缓存。然后你就可以通过cache="cachename"
to cache_page()
然后使用以下命令清除整个缓存:
from django.core.cache import caches
caches["my_cache_name"].clear()
关于此策略的重要说明
它只真正适用于未经验证的页面。用户登录的那一刻,cookie 数据就成为缓存密钥创建过程的一部分,因此以编程方式重新创建该密钥变得更加困难。我想你可以尝试从会话存储中提取 cookie 数据,但可能会有数千那里有很多键,您必须使它们中的每一个都失效/预先缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)