我的目标是缓存视图,直到发生视图缓存需要过期的事件,否则缓存 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() 缓存了最终结果查询集,好的部分是您可以设置自己的键并使用它。