清除 Django 中的特定缓存

新手上路,请多包涵

我正在为 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.....

原文由 Brenden 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 975
2 个回答

django 缓存文档,它说 cache.delete('key') 应该足够了。因此,我想到您可能遇到的两个问题:

  1. 您的导入不正确,请记住您必须从 django.core.cache 模块导入 cache
    from django.core.cache import cache

   # ...
   cache.delete('my_url')

  1. 您使用的密钥不正确(也许它使用了完整的 URL,包括“domain.com”)。要检查哪个是您可以进入 shell 的确切 url:
    $ ./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 / ?

原文由 juliomalegria 发布,翻译遵循 CC BY-SA 3.0 许可协议

我创建了一个删除以某些文本开头的键的函数。这有助于我删除动态密钥。

列出缓存的帖子

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

更新任何帖子时,请致电 flush_cache

 def update(data):
    response = mycontroller.update(data)
    flush_cache('list_posts_home')
    return response

flush_cache 删除任何动态缓存

def flush_cache(text):
    for key in list(cache._cache.keys()):
        if text in key:
            cache.delete(key.replace(':1:', ''))

不要忘记从 django 导入缓存

from django.core.cache import cache

原文由 Guilherme Iazzetta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题