Django rest_framework,在特定方法中禁用身份验证和权限

qpgpyjmq  于 2023-03-31  发布在  Go
关注(0)|答案(2)|浏览(121)

我有一个叫做UserViewSet的类:

class UserViewSet(viewsets.ModelViewSet):
    queryset = UserData.objects.all()
    serializer_class = UserSerializer
    from rest_framework.permissions import IsAuthenticated
    from rest_framework.authentication import TokenAuthentication
    permission_classes = (IsAuthenticated,)
    authentication_classes = (TokenAuthentication,)

    @action(methods=['post'], detail=False)
    def signup_user(self, request):
        request_data = request.query_params
        if len(request_data) == 0:
            return Response("Empty params !")

现在我想注册一个新用户,它会引发这个错误:
{“detail”:“未提供身份验证凭据。”}
这是因为AuthenticationPermission类。
那么在signup函数中禁用这些类的正确方法是什么呢?
我使用了authentication_classespermission_classes装饰器,但它对这个函数没有影响。

kcwpcxri

kcwpcxri1#

action decorator允许指定特定于action的权限类。这应该执行以下操作:

@action(methods=['post'], detail=False, permission_classes=[AllowAny])
    def signup_user(self, request):
        # ...

(don't forget importing AllowAny

wydwbb8l

wydwbb8l2#

而对于默认的操作,即create、retrieve、update、partial_update、destroy和list,你可以覆盖get_permissions方法(仅适用于rest mixin的子类),即

def get_permissions(self):
    permission_classes = []
    if self.action =='create':
        permission_classes = [AllowAny,]
    else:
        permission_classes = [IsAuthenticated,]

    return [permission() for permission in permission_classes]

在这一点上,你甚至可以验证与http方法,即POST,GET,PUT ...通过引用self.request
通过重写get_authenticators方法,可以对authentication_classes执行相同的操作

def get_authenticators(self):
    """
    Instantiates and returns the list of authenticators that this view can use.
    """
    authentication_classes = []
    if self.action !='create':
        authentication_classes = [TokenAuthentication, ]
    
    return [auth() for auth in authentication_classes]

相关问题