Django的每视图缓存的逻辑

时间:2013-12-24 09:50:01

标签: django caching

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):
    ....

我的问题:

  1. 我猜测了django的预览缓存的逻辑:它就像一个Python dict ,URL作为键,将HTML呈现为值。装饰视图将首先检查URL是否在该字典中,使内部重定向成为关键。我是对的吗?

  2. 工作前的代码好吗?我的情况是,员工用户的内容总是包含动态的东西,无法缓存;匿名用户的内容不容易改变,因此应该进行缓存。

1 个答案:

答案 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})