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格式配置不当,或未完成认证模块的初始化。
正确配置步骤:
- 确认
INSTALLED_APPS已添加rest_framework.authtoken,并执行迁移生成token表:
python manage.py migrate
- 在视图类中正确设置
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
相关产品推荐
相关产品推荐

