You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:36:04