wafflestudio/seminar-2020

get_permissions를 overriding하는 방식에 대한 질문

Open

#206 opened on Sep 28, 2020

 (2 comments) (3 reactions) (0 assignees)Python (49 forks)auto 404
HW2backendgood first issuequestion

Repository metrics

Stars
 (27 stars)
PR merge metrics
 (PR metrics pending)

Description

user.views의 UserViewSet를 보면 get_permissions라는 메소드가 정의되어 있습니다.

class UserViewSet(viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAuthenticated(), )

    def get_permissions(self):
        if self.action in ('create', 'login'):
            return (AllowAny(), )
        return self.permission_classes

제가 이해한 바는 아래와 같습니다.

get_permissions 메소드를 overriding하면 viewset에서 각 request를 처리할 때 어떠한 user에게 권한을 줄 지 조절할 수 있습니다. UserViewSet에서는, create과 login은 모든 user에게 권한을 줬고(AllowAny()), 그 외의 request들은 로그인 한 user들에게만 권한을 줬습니다(IsAuthenticated()). get_permissions 메소드는 DRF의 APIView라는 class에서 get_permissions를 overriding한 것입니다. get_permissions 메소드는 permissions class object를 리턴하면 됩니다.

UserViewSet에서 get_permissionspermission_classes를 정의한 방식이 어색하다고 느껴집니다. APIViewget_permissions를 살펴보면, self.permission_classes에는 object가 아니라 class가 들어있어야 한다는 사실을 알 수 있습니다. 그러나 UserViewSet에서는 object를 넣어놓았습니다. 물론 get_permissions 메소드를 새로 정의했기 때문에 작동하는데는 문제가 없지만, 다소 어색한 구현 방식이라 느껴집니다. 아래는 제가 구현해본 UserViewSet입니다.

class UserViewSet(viewsets.GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAuthenticated, )

    def get_permissions(self):
        if self.action in ('create', 'login'):
            return (AllowAny(), )
        return super(SeminarViewSet, self).get_permissions()

제가 이해한 내용이 맞는지, 그리고 이렇게 구현하신 이유가 있는지 궁금합니다.

Contributor guide