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
相关产品推荐
相关产品推荐

