我在参数中传递时,Django自定义权限无法调用装饰器

时间:2020-03-26 14:22:50

标签: python django django-rest-framework django-views django-permissions

我想在视图集上应用django权限,为此我创建了一个装饰器,但它不起作用。我只想在传入的参数中调用装饰器中的权限类。

views.py

'''

class MapViewSet(viewsets.ModelViewSet):
   serializer_class = MapSerializer

    @permission_decorator(permission_class=MapPermission)
    def get_queryset(self):
        return Map.objects.all()

'''

utils.py

'''

   METHODS = {'GET': 'view_permission',
       'PATCH': 'add_permission',
       'POST': 'add_permission',
       'PUT': 'add_permission',
       'DELETE': 'delete_permission'}


   def check_user_permission(permission, user, tag):
       # logic here
       return True/False



   class CustomBasePermissions(permissions.BasePermission):
       @abstractmethod
       def has_permission(self, request, view):
       pass


   class PermissionError(APIException):
       status_code = status.HTTP_403_FORBIDDEN
       default_detail = {'message': "You Don't have required permission"}



   class MapPermission(CustomBasePermissions):
       def has_permission(self, request, view):
           if request.role == "owner":
              return True
           else:
              permission = METHODS.get(request.method)
              return check_user_permission(permission, request.user, 'map')

'''

decorators.py

'''

def permission_decorator(permission_class):

     assert permission_class is not None, (
      "@permission_decorator() missing required argument: 'permission_class'"
          )

    def decorator(func):
       func.permission_classes = permission_class
       return func

    return decorator

'''

1 个答案:

答案 0 :(得分:0)

请在您的视图集的权限类中应用权限

class MapViewSet(viewsets.ModelViewSet):
   serializer_class = MapSerializer
   permission_classes = [MapPermission]

这将自动满足您将通过此视图集执行的所有请求类型。