我的访问者从 Varnish 获得页面的缓存版本。我希望管理员用户始终查看页面的当前版本。这样,所有的变化都是直接可见的。
存在这样的东西吗?我知道@never_cache
装饰器。我正在寻找类似的东西,只有当用户没有登录时。
如果它与 Django-CMS 一起使用,则可以加分!
我的访问者从 Varnish 获得页面的缓存版本。我希望管理员用户始终查看页面的当前版本。这样,所有的变化都是直接可见的。
存在这样的东西吗?我知道@never_cache
装饰器。我正在寻找类似的东西,只有当用户没有登录时。
如果它与 Django-CMS 一起使用,则可以加分!
我假设您正在使用缓存装饰器。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):
(...)
我发现有类似的东西:
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
如果用户和工作人员之间没有区别,这应该适用于大多数网站。
Cache-Control
要为员工显式发送标头,可以编写一些中间件(Cookie
可悲的是,标头也有所不同)。
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',
),
...