Django пользовательские разрешения не могут вызывать в декораторе, как я передал в params - PullRequest
1 голос
/ 26 марта 2020

Я хочу применить разрешения 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 голосов
/ 27 марта 2020

Пожалуйста, примените разрешения в классах разрешений вашего набора просмотра

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

Это автоматически обслужит все типы запросов, которые вы будете выполнять через этот набор просмотра.

...