Django rest framework permission_classes of ViewSet method

前端 未结 4 2069
攒了一身酷
攒了一身酷 2020-12-08 10:43

I\'m writing a rest API with the Django REST framework, and I\'d like to protect certain endpoints with permissions. The permission classes look like they provide an elegant

4条回答
  •  北荒
    北荒 (楼主)
    2020-12-08 11:33

    I think there is no inbuilt solution for that. But you can achieve this by overriding the get_permissions method:

    from rest_framework.permissions import AllowAny, IsAdminUser
    
    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
        permission_classes_by_action = {'create': [AllowAny],
                                        'list': [IsAdminUser]}
    
        def create(self, request, *args, **kwargs):
            return super(UserViewSet, self).create(request, *args, **kwargs)
    
        def list(self, request, *args, **kwargs):
            return super(UserViewSet, self).list(request, *args, **kwargs)
    
        def get_permissions(self):
            try:
                # return permission_classes depending on `action` 
                return [permission() for permission in self.permission_classes_by_action[self.action]]
            except KeyError: 
                # action is not set return default permission_classes
                return [permission() for permission in self.permission_classes]
    

提交回复
热议问题