粒度页面缓存
Granular page caching
我网站的着陆页被缓存,原因很明显:
url(r'^$', cache_page(7200)(vary_on_cookie(LandingPage.as_view())), name='landing_page')
现在我们引入了一个新页面,如果满足某些条件,我们希望该路由重定向到该页面,本质上是检查用户是否对某个对象具有权限:
class LandingPage(TemplateView):
def dispatch(self, request, *args, **kwargs):
if has_permission(self.request.user, object):
return redirect('new_page')
return super(LandingPage, self).dispatch(request, *args, **kwargs)
但是,由于视图已缓存,如果原始着陆页已缓存,则不会重定向用户。反之亦然。
我想要的是视图总是运行权限检查。如果通过,它应该重定向到不应缓存的新页面。如果没有,则应返回着陆页,并对其进行缓存。
您可以将 cache_page
调用从 urls
移动到覆盖的 dispatch
方法,如下所示:
class LandingPage(TemplateView):
def dispatch(self, request, *args, **kwargs):
if has_permission(self.request.user, object):
return redirect('new_page')
cached_dispatch = cache_page(7200)(vary_on_cookie(super(
LandingPage, self
).dispatch))
return cached_dispatch(request, *args, **kwargs)
这样检查将始终在返回缓存响应之前执行
我网站的着陆页被缓存,原因很明显:
url(r'^$', cache_page(7200)(vary_on_cookie(LandingPage.as_view())), name='landing_page')
现在我们引入了一个新页面,如果满足某些条件,我们希望该路由重定向到该页面,本质上是检查用户是否对某个对象具有权限:
class LandingPage(TemplateView):
def dispatch(self, request, *args, **kwargs):
if has_permission(self.request.user, object):
return redirect('new_page')
return super(LandingPage, self).dispatch(request, *args, **kwargs)
但是,由于视图已缓存,如果原始着陆页已缓存,则不会重定向用户。反之亦然。
我想要的是视图总是运行权限检查。如果通过,它应该重定向到不应缓存的新页面。如果没有,则应返回着陆页,并对其进行缓存。
您可以将 cache_page
调用从 urls
移动到覆盖的 dispatch
方法,如下所示:
class LandingPage(TemplateView):
def dispatch(self, request, *args, **kwargs):
if has_permission(self.request.user, object):
return redirect('new_page')
cached_dispatch = cache_page(7200)(vary_on_cookie(super(
LandingPage, self
).dispatch))
return cached_dispatch(request, *args, **kwargs)
这样检查将始终在返回缓存响应之前执行