URL配置:
...
(r'^entry/(.*)', 'myapp.views.entry_view'),
...
查看功能
from django.views.decorators.cache import cache_page
def entry_view(request,entry_id):
if request.user.is_staff:
retrun entry_staff(request,entry_id)
else:
return entry_user(request,entry_id)
# don't cache this view
def entry_staff(request,entry_id):
....
@cache_page
def entry_user(request,entry_id):
....
我的问题:
我猜测了django的预览缓存的逻辑:它就像一个Python dict ,URL作为键,将HTML呈现为值。装饰视图将首先检查URL是否在该字典中,使内部重定向成为关键。我是对的吗?
工作前的代码好吗?我的情况是,员工用户的内容总是包含动态的东西,无法缓存;匿名用户的内容不容易改变,因此应该进行缓存。
答案 0 :(得分:0)
您可以使用low level cache API手动将项目添加到缓存中。
在这种情况下,你不会使用装饰器;相反,您的其他方法只会将数据返回到您的映射方法,并且在循环中您将设置从缓存中过期的任何值:
from django.core.cache import cache
from django.contrib.auth.decorators import login_required
def entry_staff(entry_id):
return 'staff only value'
def entry_user(entry_id):
return 'value to cache'
@login_required
def entry_view(request,entry_id):
if request.user.is_staff:
value = entry_staff(entry_id)
else:
value = cache.get('key','NO-VALUE')
if value == 'NO-VALUE':
# cache expired
value = entry_user(entry_id)
cache.set('key', value, 30*60)
return render(request, 'template.html', {'value': value})