Невозможно перейти от назначения классов разрешений к использованию декоратора @permission_classes

Ниже представлен api, для которого требуется authen. Это работает

class some_random_api(generics.GenericAPIView): 
    permission_classes = (IsAuthenticated, )
    def get(self,request):
        return HttpResponse("Called successfully")

Однако мне не нравится объявлять переменные. После изучения этого документа, https://www.django-rest-framework.org/api-guide/permissions/ . Я нашел альтернативный способ, используя декоратор. Поэтому я изменил свой код на следующий.

from rest_framework.decorators import permission_classes
class some_random_api(generics.GenericAPIView): 
    @permission_classes(IsAuthenticated)
    def get(self,request):
        return HttpResponse("You call random test api")

Теперь этот API не проверяет Authen

Декоратор @permission_classes применим только к представлениям API, основанным на функциях, как документировано .

REST framework предоставляет набор дополнительных декораторов, которые могут быть добавлены к вашим представлениям. Они должны появляться после (ниже) декоратора @api_view.

.

Доступными декораторами являются:

...
@permission_classes(...)
...

Также здесь:

Или, если вы используете декоратор @api_view с представлениями, основанными на функциях .

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
    ...

Альтернативой определению фиксированного списка permission_classes = (IsAuthenticated, ) является переопределение get_permissions() и назначение различных разрешений для различных методов HTTP, как описано здесь.

class some_random_api(generics.GenericAPIView): 
    def get_permissions(self):
        if self.request.method == "GET":  # If using viewsets, the self.action can be used e.g. <if self.action == "retrieve":>
            permission_classes = [permissions.IsAuthenticated]
        else:
            permission_classes = [permissions.IsAdminUser]
        return [permission() for permission in permission_classes]

    def get(self, request):
        return HttpResponse("You call random test api")

Связанные вопросы:

Вернуться на верх