如何在django中手动清除/更新缓存视图

时间:2017-10-31 16:44:49

标签: django caching

我的目标是缓存视图,直到视图的缓存需要到期的事件发生,否则缓存1小时。这就是我在urls.py中所拥有的。

url(r'^get_some_stuff/$', cache_page(60 * 60, key_prefix='get_some_stuff')(views.StuffView.as_view())),

这很好用。现在我正在尝试获取缓存的视图以验证那里有什么东西我尝试了这个:

from django.core.cache import cache
cache.get('get_some_stuff')

但是这会返回None。我希望能做到这样的事情:

from django.core.cache import cache
#relevant event happened
cache.delete('get_some_stuff')

处理缓存的正确方法是什么?

我试过传递uri路径:

cache.get('/api/get_some_stuff/')

我还是没有回来。

>>> cache.has_key('/api/get_some_stuff/')
False
>>> cache.has_key('/api/get_some_stuff')
False
>>> cache.has_key('get_some_stuff')
False

我已经回顾了建议的答案,但根本没有解决根本问题。它似乎并不像传递uri路由路径那样简单,因为密钥在django中有点抽象。

2 个答案:

答案 0 :(得分:1)

Django的Cache framework只允许在预定义的时间内缓存数据,并清除过期的缓存数据,您可能需要使用django-signals来通知一些清除缓存的接收函数。

而cache.get,cache.has_key,cache.delete要求传递完整的cache_key而不是url或key-prefix。由于django负责处理密钥,因此我们无法获得或删除数据。

如果您正在使用数据库缓存,则使用原始SQL查询在数据库表失效时从数据库表中删除缓存记录。写一个查询,说明从cache_table中删除cache_key就像('%1:views.decorators.cache.cache_page%')

我遇到了与每个视图缓存相同的问题,我选择low-level cache api。我使用cache.set()缓存了最终结果查询集,很好的部分是你可以设置自己的密钥并使用它。

答案 1 :(得分:1)

这是关于过期@cache_page 的code snippet from Relekang

from django.core.cache import cache
from django.core.urlresolvers import reverse
from django.http import HttpRequest
from django.utils.cache import get_cache_key

def expire_page_cache(view, args=None):
    """
    Removes cache created by cache_page functionality. 
    Parameters are used as they are in reverse()
    """

    if args is None:
        path = reverse(view)
    else:
        path = reverse(view, args=args)

    request = HttpRequest()
    request.path = path
    key = get_cache_key(request)
    if cache.has_key(key):
        cache.delete(key)