Django DRF @permission_classes не работает для разрешения IsAdminUser - PullRequest
0 голосов
/ 26 марта 2020

Я хочу применить разрешение IsAdminUser на мой взгляд. Я могу сделать это, установив атрибут access_classes:

class UserProfileView(APIView):
    permission_classes = [IsAdminUser,]

    def get(self, request, pk=None):
        ...

Однако, если я попытаюсь сделать то же самое с помощью декоратора, то это будет неэффективно и проверяет только для аутентифицированных пользователей.

class UserProfileView(APIView):

    @permission_classes([IsAdminUser])
    def get(self, request, pk=None):
        ...

Я хочу понять, почему так себя ведет. Я делаю что-то не так? Моя конфигурация среды: Python == 3.7.6, Django == 2.2.10, djangorestframework == 3.11.0, django -oauth-toolkit == 1.2.0

1 Ответ

0 голосов
/ 27 марта 2020

Он не должен работать на обработчиках APIView, @permission_classes просто устанавливает func.permission_classes = permission_classes, а затем @api_view декоратор обертывает функцию с классом APIView. Когда APIView вызывает обработчик, он не проверяет permission_classes, установленный для этого обработчика, поскольку эти проверки выполняются в методе initial. Вот часть APIView.dispatch:

self.initial(request, *args, **kwargs)
# part of initial:
#     self.check_permissions(request)

# Get the appropriate handler method
if request.method.lower() in self.http_method_names:
    handler = getattr(self, request.method.lower(),
                      self.http_method_not_allowed)
else:
    handler = self.http_method_not_allowed

response = handler(request, *args, **kwargs)

Если вы хотите применить разные разрешения к разным обработчикам (таким как get или post), вы можете:

  1. Создать свой собственный класс прав доступа и укажите его в permission_classes
  2. Переопределить check_permissions
  3. Поместить права доступа c в обработчики
...