如果用户登录,Django会阻止缓存视图

时间:2011-09-06 06:43:29

标签: django http-caching

我的访问者从Varnish获得了该页面的缓存版本。 我希望管理员用户一直看到该页面的当前版本。 这样,所有更改都可以直接显示。

这样的事情存在吗? 我知道@never_cache装饰器。 我正在寻找类似的东西,只有用户没有登录。

如果它适用于Django-CMS,则可获得积分!

3 个答案:

答案 0 :(得分:8)

我认为您正在使用缓存装饰器。下面的代码是一个装饰器,只有当用户不是管理员时才会返回用另一个装饰器(即cache_page)装饰的视图。因此,admin将始终获取非装饰(非缓存)页面,而其他用户将获得装饰(因此可能是缓存)页面。它适用于所有可能的装饰器(不仅仅是cache_page)。

def conditional_cache(decorator):
    """ Returns decorated view if user is not admin. Un-decorated otherwise """

    def _decorator(view):

        decorated_view = decorator(view)  # This holds the view with cache decorator

        def _view(request, *args, **kwargs):

            if request.user.is_staff:     # If user is staff
                return view(request, *args, **kwargs)  # view without @cache
            else:
                return decorated_view(request, *args, **kwargs) # view with @cache

        return _view

    return _decorator

要使用它,而不是典型的语法:

@cache_page(123)
def testview(request):
    (...)

使用:

@conditional_cache(decorator=cache_page(123))  # The argument is what you usually do with views, but without the @
def testview(request):
    (...)

答案 1 :(得分:1)

我发现有类似的东西:

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

如果用户和员工之间没有区别,这应该适用于大多数网站。

要为工作人员显式发送Cache-Control标题,可以编写一些中间件(遗憾地在Cookie标题上也会有所不同)。

答案 2 :(得分:0)

CACHE_MIDDLEWARE_ANONYMOUS_ONLY is removed in Django 1.8

相反,可以使用vary headers,更具体地说,可以使用装饰器vary_on_cookie

这意味着根据每个用户的cookie保留单独的缓存。

登录用户有一个cookie而不是未登录的cookie,因此每个cookie会话都会创建不同的缓存。以下是我的实施。

urls.py条目:

from django.views.decorators.vary import vary_on_cookie
from django.views.decorators.cache import cache_page

...
    url(
            r'^$',
            cache_page(60 * 1440, cache='disk')(vary_on_cookie(MyCbvView.as_view())),
            name='view-name',
        ),
...