如何在Django视图方法中使用PermissionRequiredMixin实现权限控制
Django PermissionRequiredMixin 视图权限管控实现方案
PermissionRequiredMixin是Django原生为类视图设计的权限校验混入类,针对不同的视图类型有对应的实现方案,具体如下:
1 类视图直接使用(原生支持)
这是官方推荐的标准用法,步骤如下:
- 自定义视图类继承时,将
PermissionRequiredMixin放在继承顺序的第一位,避免MRO调用顺序异常导致权限校验失效 - 配置
permission_required属性,值为权限字符串,单个权限传字符串,多个权限传列表(默认需满足所有权限才放行) - 可选配置:自定义
login_url指定无权限时的跳转地址,或设置raise_exception=True直接返回403响应 - 可选自定义:重写
has_permission方法实现额外的权限校验逻辑
示例代码:
from django.views.generic import ListView from django.contrib.auth.mixins import PermissionRequiredMixin from .models import Article class ArticleListView(PermissionRequiredMixin, ListView): # 配置需要校验的权限 permission_required = "blog.view_article" # 无权限时直接返回403,不跳登录页 raise_exception = True model = Article template_name = "article/list.html"
2 函数视图适配使用
如果你用的是函数视图,可以对PermissionRequiredMixin做简单封装,实现相同的权限校验能力:
示例代码:
from django.contrib.auth.mixins import PermissionRequiredMixin from django.views.generic import View from django.http import HttpResponse # 封装为函数视图可用的装饰器 def perm_required(perm, login_url=None, raise_exception=False): def decorator(view_func): class WrappedView(PermissionRequiredMixin, View): permission_required = perm login_url = login_url raise_exception = raise_exception def dispatch(self, request, *args, **kwargs): if not self.has_permission(): return self.handle_no_permission() return view_func(request, *args, **kwargs) return WrappedView.as_view() return decorator # 函数视图上使用装饰器 @perm_required("blog.add_article", raise_exception=True) def add_article(request): # 业务逻辑 return HttpResponse("文章添加成功")
3 自定义权限校验逻辑
如果默认的权限字符串校验不满足需求,可以重写has_permission方法扩展校验规则,示例:
class ArticleEditView(PermissionRequiredMixin, View): permission_required = "blog.change_article" def has_permission(self): # 先执行原生的权限校验 if not super().has_permission(): return False # 扩展校验:用户只能编辑自己发布的文章 article = Article.objects.get(id=self.kwargs["article_id"]) return article.author == self.request.user
内容的提问来源于stack exchange,提问作者forcen4
相关产品推荐
相关产品推荐

