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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:27:29