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



我的目标是缓存视图,直到发生视图缓存需要过期的事件,否则缓存 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 中有些抽象。

这是来自 Relekang 的关于过期@cache_page的代码片段

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)

Django 的缓存框架只允许在预定义的时间内缓存数据,并且要清除过期的缓存数据,您可能需要使用 django 信号来通知一些清除缓存的接收器函数。

cache.get,cache.has_key,cache.delete需要传递完整的cache_key,而不是url或键前缀。由于 django 负责处理密钥,因此我们无法控制获取或删除数据。

如果使用数据库缓存,则使用原始 sql 查询在缓存记录过时时时从数据库表中删除缓存记录。 编写一个查询,其中显示从cache_table中删除,cache_key类似 ('%1:views.decorators.cache.cache_page%')

我在按视图缓存方面遇到了同样的问题,我使用了低级缓存 api。我使用 cache.set() 缓存了最终结果查询集,好的部分是您可以设置自己的键并使用它。

最新更新