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

Django自定义权限类报错:'User' object has no attribute 'user'

解决DRF自定义权限类的AttributeError及TokenAuthentication配置问题

一、修复自定义权限类的AttributeError错误

错误根源:

  • request.user已经是当前认证的User对象,额外调用.user属性属于冗余操作,直接触发'User' object has no attribute 'user'错误。
  • Django中User与Group是多对多关联,对应的属性是**groups(复数)**,而非group(单数)。

修正后的权限类代码:

from rest_framework import permissions

class IsManager(permissions.BasePermission):
    def has_permission(self, request, view):
        # 先校验用户是否已认证
        if not request.user.is_authenticated:
            return False
        # 通过groups过滤目标用户组
        return request.user.groups.filter(name='managers').exists()

class IsDeliveryCrew(permissions.BasePermission):
    def has_permission(self, request, view):
        if not request.user.is_authenticated:
            return False
        return request.user.groups.filter(name='delivery crew').exists()

二、修复TokenAuthentication的"type" object isn't iterable错误

错误原因:authentication_classes格式配置不当,或未完成认证模块的初始化。

正确配置步骤:

  1. 确认INSTALLED_APPS已添加rest_framework.authtoken,并执行迁移生成token表:
python manage.py migrate
  1. 在视图类中正确设置authentication_classes,推荐使用列表格式(单个元素的元组需加逗号避免语法歧义):
from rest_framework.authentication import TokenAuthentication

class SingleMenuItemView(generics.RetrieveUpdateDestroyAPIView):
    authentication_classes = [TokenAuthentication]
    throttle_classes=[UserRateThrottle,AnonRateThrottle]
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemSerialzier
    
    def get_permissions(self):
        permission_classes = [IsAuthenticated]
        if self.request.method == "PATCH":
            permission_classes = [IsAuthenticated, IsManager | IsAdminUser]
        if self.request.method == "DELETE":
            permission_classes = [IsAuthenticated, IsAdminUser]
        return [permission() for permission in permission_classes]

补充说明

  • 权限组合IsManager | IsAdminUser表示用户满足任一权限即可访问,DRF支持这种逻辑运算符组合方式。
  • 若需全局启用TokenAuthentication,可在settings.py中配置:
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

无需在每个视图中单独设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:43:10