wafflestudio/seminar-2020

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

オープン

#206 opened on 2020/09/28

 (2 件のコメント) (3 件のリアクション) (0 人の担当者)Python (49 件のフォーク)auto 404
HW2backendgood first issuequestion

Repository metrics

Stars
 (27 個のスター)
PR merge metrics
 (PR metrics pending)

説明

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()

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

コントリビューターガイド