4

我的访问者从 Varnish 获得页面的缓存版本。我希望管理员用户始终查看页面的当前版本。这样,所有的变化都是直接可见的。

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

如果它与 Django-CMS 一起使用,则可以加分!

4

3 回答 3

10

我假设您正在使用缓存装饰器。cache_page下面的代码是一个装饰器,仅当用户不是管理员时才返回一个用另一个装饰器(即)装饰的视图。所以管理员总是会得到未修饰(未缓存)的页面,而其他用户将得到修饰(因此可能是缓存)页面。它适用于所有可能的装饰器(不仅适用于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):
    (...)
于 2012-02-21T12:49:15.410 回答
1

我发现有类似的东西:

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

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

Cache-Control要为员工显式发送标头,可以编写一些中间件(Cookie可悲的是,标头也有所不同)。

于 2012-02-22T10:41:59.590 回答
1

CACHE_MIDDLEWARE_ANONYMOUS_ONLY 在 Django 1.8 中被删除

相反,可以使用不同的标头,更具体地说,可以使用装饰器vary_on_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',
        ),
...
于 2017-01-19T22:28:29.780 回答