我正在为django项目使用视图缓存。
它说缓存使用URL作为密钥,所以我想知道如果用户更新/删除对象,如何清除其中一个密钥的缓存。
示例:用户将博客帖子发布到domain.com/post/1234/
。如果用户编辑了该帖子,我想通过在末尾添加某种删除缓存命令来删除该URL的缓存版本保存已编辑帖子的视图。
我正在使用:
@cache_page(60 * 60)
def post_page(....):
如果post.id是1234,看起来这可能有用,但不是:
def edit_post(....):
# stuff that saves the edits
cache.delete('/post/%s/' % post.id)
return Http.....
答案 0 :(得分:16)
来自django cache docs,它表示cache.delete('key')
应该足够了。所以,我想到了你可能遇到的两个问题:
您的导入不正确,请记住您必须从cache
模块导入django.core.cache
:
from django.core.cache import cache
# ...
cache.delete('my_url')
您使用的密钥不正确(可能使用完整的网址,包括“domain.com”)。要检查哪个是确切的URL,你可以进入你的shell:
$ ./manage.py shell
>>> from django.core.cache import cache
>>> cache.has_key('/post/1234/')
# this will return True or False, whether the key was found or not
# if False, keep trying until you find the correct key ...
>>> cache.has_key('domain.com/post/1234/') # including domain.com ?
>>> cache.has_key('www.domain.com/post/1234/') # including www.domain.com ?
>>> cache.has_key('/post/1234') # without the trailing / ?
答案 1 :(得分:0)
I make a function to delete key starting with some text. This help me to delete dynamic keys.
list posts cached
def get_posts(tag, page=1):
cached_data = cache.get('list_posts_home_tag%s_page%s' % (tag, page))
if not cached_data:
cached_data = mycontroller.get_posts(tag, page)
cache.set('list_posts_home_tag%s_page%s' % (tag, page), cached_data, 60)
return cached_data
when update any post, call flush_cache
def update(data):
response = mycontroller.update(data)
flush_cache('list_posts_home')
return response
flush_cache to delete any dynamic cache
def flush_cache(text):
for key in list(cache._cache.keys()):
if text in key:
cache.delete(key.replace(':1:', ''))
Do not forget to import cache from django
from django.core.cache import cache
答案 2 :(得分:0)
有一个技巧可以解决这个问题。 cache_page
装饰器采用key_prefix
的可选参数。例如,当您在单个缓存中有多个站点时,应该使用它。 the docs说的是这样:
CACHE_MIDDLEWARE_KEY_PREFIX
–如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或该Django实例唯一的其他字符串,以防止按键冲突。如果您不在乎,请使用空字符串。
但是,如果您没有多个站点,则可以这样滥用它:
cache_page(cache_length, key_prefx="20201215")
我使用日期作为前缀,因此如果需要,可以很容易地轮换使用新的失效键。这应该很好用。
但是!请注意,如果您使用此技巧,则某些高速缓存(例如,数据库高速缓存,文件系统高速缓存,可能还有其他)不会清除过期的条目,除非它们被访问。如果使用上面的技巧,您将永远不会再访问高速缓存条目,并且直到您将其清除后,它才会持续存在。可能无关紧要,但值得考虑。