Django中'AnonymousUser'对象无'group'属性错误求助及排查
问题排查与解决
错误原因
核心问题是权限类属性名拼写错误:原代码中写的是permissions_classes(多了一个's'),而Django REST Framework要求的正确属性名是permission_classes。这导致权限验证逻辑完全未生效,未登录用户的请求也能进入get_queryset方法,而AnonymousUser对象不存在group属性,触发报错。
另外,即使权限配置正确,也建议在访问用户属性前添加认证状态判断,作为额外安全防护。
修正方案
- 修正权限类属性名的拼写错误
- 在
get_queryset中增加用户认证状态的判断,避免意外场景下的错误
修正后的代码
from django.db.models import Q from rest_framework import generics, permissions from .models import Trip from .serializers import NestedTripSerializer class TripView(generics.ListCreateAPIView): lookup_field = 'id' lookup_url_kwarg = 'trip_id' serializer_class = NestedTripSerializer # 修正属性名:去掉多余的's' permission_classes = (permissions.IsAuthenticated,) def get_queryset(self): user = self.request.user # 先验证用户是否已认证,作为额外安全层 if not user.is_authenticated: return Trip.objects.none() if user.group == 'driver': return Trip.objects.filter( Q(status=Trip.REQUESTED) | Q(driver=user) ) elif user.group == 'rider': return Trip.objects.filter(rider=user) return Trip.objects.none()
说明
- 修正
permission_classes后,DRF会在请求进入视图方法前自动拦截未登录用户,直接返回401未授权响应,不会执行get_queryset - 添加
user.is_authenticated判断是冗余但必要的防护,避免因后续权限配置变更、视图继承等原因导致的认证失效问题
内容的提问来源于stack exchange,提问作者nabraz bhandari
相关产品推荐
相关产品推荐

