我的访问者从Varnish获得了该页面的缓存版本。 我希望管理员用户一直看到该页面的当前版本。 这样,所有更改都可以直接显示。
这样的事情存在吗?
我知道@never_cache
装饰器。
我正在寻找类似的东西,只有用户没有登录。
如果它适用于Django-CMS,则可获得积分!
答案 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',
),
...