粒度页面缓存

问题描述 投票:1回答:1

出于明显的原因,我的网站的登录页面已被缓存:

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)

但是,由于已缓存视图,如果原始目标页面已被缓存,则不会重定向用户。反之亦然。

我想要的是使视图始终运行权限检查。如果通过,它将重定向到不应缓存的新页面。如果不是,则应返回登录页面,并应对其进行缓存。

django caching django-templates django-1.8
1个回答
1
投票

您可以像这样将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)

这样,将始终在返回缓存的响应之前执行检查

© www.soinside.com 2019 - 2024. All rights reserved.