django - 粒度页面缓存
问题描述
由于明显的原因,我的网站的目标网页被缓存:
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)
这样,将始终在返回缓存的响应之前执行检查
推荐阅读
- javascript - JavaScript:在同一个循环中迭代推送的元素
- json - 在 web api 中以 json 格式显示 sql 查询结果
- node.js - 为 Nodejs 项目设置 Azure 函数环境变量
- spring-boot - 使用 oauth 和带有表单登录的 UI 的 Secure Rest API
- javascript - 为什么我在chartjs上的数据不是从它应该的数据开始
- vue.js - 无法使用 v-bind:to 指令使 `/${i18n.locale}` 工作
- react-native - 如何区分codepush和storepush
- javascript - 如何在 Odoo 10 中为特定模型禁用看板视图中的拖放?
- c# - 如何将带有cshtml文件的类库引用到azure函数
- spring-cloud-dataflow - 是否可以使用单个 SCDF 服务器并连接多个存储库?