Django中PermissionRequiredMixin的继承顺序是否有要求?
Django 权限与登录验证Mixin的继承顺序问题
1. PermissionRequiredMixin 必须放继承列表首位
没错,你观察到的现象是对的——PermissionRequiredMixin必须放在继承列表的最左边。
Django类视图的父类方法(比如核心的dispatch)是按从左到右的顺序执行的。如果把它放在具体View类(比如TemplateView、ListView)后面,View类的dispatch会先执行,直接进入页面渲染流程,完全跳过权限验证,自然就出现“权限失效直接进页面”的问题。
只有把它放首位,才会先触发权限检查:
- 用户未登录?自动跳转到登录页;
- 已登录但无对应权限?返回403权限拒绝响应。
2. LoginRequiredMixin 的继承要求
LoginRequiredMixin只需要放在具体View类之前就行,位置不用像PermissionMixin那么严格。比如:
class MyView(LoginRequiredMixin, TemplateView): # 配置项...
这个顺序下,会先检查用户是否登录,未登录则跳转登录页,已登录才会执行后续页面渲染逻辑。
3. 同时继承两者的正确处理方式
当需要同时做登录验证和权限验证时,推荐的继承顺序是:PermissionRequiredMixin → LoginRequiredMixin → 具体View类
示例代码:
class MyProtectedView(PermissionRequiredMixin, LoginRequiredMixin, TemplateView): permission_required = 'myapp.can_view_content' # 其他配置...
这个顺序的逻辑更顺畅:
- 先执行权限检查,
PermissionRequiredMixin内部会先判断用户是否登录,未登录直接跳转登录页; - 登录状态验证通过后,再检查权限,无权限则返回403;
- 全部验证通过后,才会走到
LoginRequiredMixin(此时用户已登录,直接通过)和View类的渲染逻辑。
当然反过来把LoginRequiredMixin放前面也能正常运行,但官方更推荐把权限相关的Mixin放在靠前位置——毕竟权限验证本身就包含了登录状态检查的逻辑,流程上更合理。
内容的提问来源于stack exchange,提问作者xcRt
相关产品推荐
相关产品推荐

