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

如何在Django Rest Framework中基于用户组配置视图权限?

解决Django Rest Framework中特定用户组访问视图的问题

先梳理你之前三种方法的核心错误:

  • 方法一:使用Django原生permission_required装饰器时,未传入完整权限格式(需为{app_label}.{permission_codename}),且该装饰器适配原生Django请求,与DRF的Request对象兼容不佳。
  • 方法二:自定义权限类中request.user.is_customer逻辑错误(未给User模型添加该字段),且错误地将DRF权限类传给了Django原生装饰器,二者不兼容。
  • 方法三:permission_classes装饰器需传入权限类的列表,而非字符串,字符串无法被DRF识别为有效权限逻辑。

正确实现方式

根据你的场景(默认权限为IsAdminUser,需开放特定视图给customers组/拥有is_customer权限的用户),推荐两种方案:

方案1:自定义权限类,检查用户是否拥有指定权限

from rest_framework import permissions
from rest_framework.decorators import api_view, permission_classes

class IsCustomer(permissions.BasePermission):
    def has_permission(self, request, view):
        # 传入完整权限标识:app名称.权限codename
        # 若权限创建在自定义app下,替换auth为你的app名称
        return request.user.has_perm('auth.is_customer')

@api_view(["POST"])
# 覆盖默认权限,使用自定义权限类
@permission_classes([IsCustomer])
def my_func(request):
    # calculations
    return Response(...)

方案2:自定义权限类,检查用户是否属于指定组

如果希望直接校验用户所在组:

from rest_framework import permissions
from rest_framework.decorators import api_view, permission_classes

class IsInCustomerGroup(permissions.BasePermission):
    def has_permission(self, request, view):
        # 检查用户是否在customers组内
        return request.user.groups.filter(name='customers').exists()

@api_view(["POST"])
@permission_classes([IsInCustomerGroup])
def my_func(request):
    # calculations
    return Response(...)

补充:多权限组合

若需同时允许管理员和客户访问,可组合权限类:

@permission_classes([permissions.IsAdminUser | IsCustomer])

内容的提问来源于stack exchange,提问作者WhoDatBoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:25:20