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

Django REST Framework中ViewSet添加authentication_classes装饰器报错

问题分析与解决方案

首先明确:@authentication_classes装饰器仅适用于函数视图,直接给ViewSet的action方法加这个装饰器会破坏类视图的内部逻辑,导致你遇到的'list' object is not callable错误。

正确的处理方式

对于DRF的ViewSet(类视图),设置认证类有两种规范方式:

1. 全局给ViewSet类设置认证类

如果这个ViewSet下的所有接口都需要Token认证,直接在类上定义authentication_classes属性:

class AbcViewSet(viewsets.ModelViewSet):
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsOwnerOrReadOnly]

    @action(detail=False)
    @debugger_queries
    def get_xyz(self, request, pk=None):
        # 这里request.user应该能正确获取到认证用户
        # ...

2. 仅给单个action设置认证类

如果只想让get_xyz这个接口用Token认证,直接在@action装饰器里通过authentication_classes参数指定,不需要额外加装饰器:

class AbcViewSet(viewsets.ModelViewSet):

    @action(
        detail=False,
        permission_classes=(IsOwnerOrReadOnly,),
        authentication_classes=[TokenAuthentication]
    )
    @debugger_queries
    def get_xyz(self, request, pk=None):
        # ...

额外排查点

你提到settings.py已经配置了TokenAuthentication为默认认证类,但仍出现匿名用户,可能还需要检查:

  • 请求头是否正确携带Token:格式应为Authorization: Token <你的token字符串>
  • 确认Token是否有效,没有过期或被撤销
  • 检查项目中是否有自定义中间件干扰了认证流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:32:00