Как работает Django Rest Framework access_classes? - PullRequest
0 голосов
/ 29 марта 2020

Я не понимаю, почему атрибут access_classes GenericView - это список. Скажите, почему это

permission_classes = [IsAdminUser]

, а не

permission_class = IsAdminUser

? Также можно ли добавить 2 или более элементов в список, если да, то как мне это интерпретировать?

permission_classes = [IsAdminUser, IsAuthenticated]

Является ли фрагмент выше над

permission_classes = [IsAdminUser & IsAuthenticated]

? Также, как я должен интерпретировать побитовое ИЛИ на разрешениях?

permission_classes = [IsAdminUser | IsAuthenticated]

Спасибо

Ответы [ 2 ]

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

Почему этот список похож на permission_classes = [A, B]

Предположим, вы хотите проверить несколько условий, например, аутентифицированный пользователь должен быть администратором, а HTTP-запрос поступит с 172.123.12.12/32.

В это время вы можете использовать IsAdminUser и IsWhiteListedIP как permission_classes = [IsAdminUser , IsWhiteListedIP].

Если вы избегаете списка, то оба WhileListedIP и IsAdminUser logi c необходимы для реализации в одном классе. Это поставит под угрозу повторное использование класса. Следовательно, каждый класс (WhileListedIP и IsAdminUser) фокусируется только на конкретной задаче c; Вы можете использовать их отдельно в представлениях и наборе видов независимо.

Когда вы предоставляете список в permission_classes, все должны пройти без каких-либо исключений. Так что да, они действуют как & условие.

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

Из разрешения DRF документация

При условии, что они наследуются от rest_framework.permissions.BasePermission, разрешения могут быть составлены с использованием стандартных Python битовых операторов.

Например, IsAuthenticatedOrReadOnly можно записать так:

class ExampleView(APIView):
    permission_classes = [IsAuthenticated|ReadOnly]

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

Поведение списка по умолчанию такое же, как & (AND)

...