Django类视图dispatch显示AnonymousUser,get_object可获取用户
问题原因
DRF的认证、权限等核心逻辑是在APIView.dispatch方法的initial步骤中执行的,你重写dispatch时,若在调用父类dispatch方法之前直接打印request.user,此时两个关键步骤还未完成:
- 原始HttpRequest未被包装为DRF的Request对象
JWTAuthentication的认证逻辑尚未触发
因此此时的request.user是未认证的AnonymousUser。
而get_object是在视图的业务处理方法(如retrieve)中被调用的,此时父类dispatch已经完成了request包装、认证、权限检查全流程,self.request已经关联上了认证后的用户,所以能正确返回自定义用户模型的邮箱。
解决方案
要在dispatch中获取认证后的用户信息,只需提前执行DRF的初始化与认证逻辑即可,以下是两种稳妥的实现方式:
方式一:手动触发完整的初始化与认证流程
直接按照DRF的原有流程,先完成request包装和initial步骤,再执行你的自定义限流逻辑:
class ProductViewSet(ReadOnlyModelViewSet): authentication_classes = [JWTAuthentication] permission_classes = [IsAuthenticated] queryset = Product.objects.all() serializer_class = ProductSerializer def dispatch(self, request, *args, **kwargs): # 1. 将原始request包装为DRF的Request对象 request = self.initialize_request(request, *args, **kwargs) self.request = request try: # 2. 执行认证、权限、节流的初始化检查 self.initial(request, *args, **kwargs) # 3. 此时可正常获取认证后的用户,执行你的自定义限流逻辑 print(request.user) # 输出自定义用户的邮箱 # 4. 继续处理请求 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) response = handler(request, *args, **kwargs) except Exception as exc: response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs) return self.response
方式二:简化触发认证(仅获取用户,不提前处理权限/节流)
如果只需要获取用户信息,也可以手动触发request.user的惰性加载(内部会自动调用认证逻辑):
def dispatch(self, request, *args, **kwargs): # 先将原始request包装为DRF的Request对象 drf_request = self.initialize_request(request, *args, **kwargs) # 触发认证逻辑 drf_request.user print(drf_request.user) # 输出认证后的用户 # 调用父类dispatch继续处理后续流程 return super().dispatch(request, *args, **kwargs)
注意:方式二更简洁,但会跳过权限、节流的提前检查,若你的限流逻辑依赖权限判断,推荐使用方式一。
内容的提问来源于stack exchange,提问作者suraj sharma
相关产品推荐
相关产品推荐

