DRF报错:'function'对象无'get_extra_actions'属性(React访问触发)
问题根源
你的核心错误是将用于函数视图的@api_view装饰器用在了类视图(ViewSet)上,这个装饰器会把你的HelloViewSet类转换成一个函数对象,而DRF的Router需要接收的是ViewSet类类型,因此触发了'function' object has no attribute 'get_extra_actions'错误。
解决方案
1. 移除错误的装饰器
直接删除HelloViewSet类上方的@api_view(['GET'])和@permission_classes([AllowAny])装饰器,因为DRF的viewsets.ModelViewSet本身继承自APIView,已经具备处理API请求的能力,不需要额外的函数视图装饰器。
2. 正确配置权限
关于你提到的401认证错误,通过类属性permission_classes直接配置即可,不需要依赖装饰器。你之前同时使用装饰器和类属性的方式会导致权限规则冲突,类属性会覆盖装饰器的设置。
修改后的views.py代码:
from rest_framework import viewsets from rest_framework.response import Response from rest_framework.permissions import AllowAny, DjangoObjectPermissions class HelloViewSet(viewsets.ModelViewSet): # dummy serializers and queryset for now serializer_class = SomeDummyDetailSerializer queryset = SomeDummyObject.objects.all() # 根据需求设置权限,这里改为AllowAny解决401问题 permission_classes = [AllowAny] def list(self, request): # get list return Response({'message': 'Hello, worlds!'}) def retrieve(self, request, pk=None): # get detail return Response({'message': 'Hello, worlds!'})
补充说明
@api_view仅适用于函数式视图,不能用于类视图,这是你触发错误的关键原因。- 如果后续需要恢复
DjangoObjectPermissions权限,只需把permission_classes改回[DjangoObjectPermissions]即可,无需引入额外装饰器。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

