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_permissions와 permission_classes를 정의한 방식이 어색하다고 느껴집니다. APIView의 get_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()
제가 이해한 내용이 맞는지, 그리고 이렇게 구현하신 이유가 있는지 궁금합니다.