Maximize Your Potential

BackEnd

DRF 설명서 개념 때려잡기 : 믹스인(Mixins), 인증과 권한

maxworld 2024. 9. 18. 16:05
728x90
반응형

DRF 설명서 개념 때려잡기 : 믹스인(Mixins), 인증과 권한

믹스인(Mixins)

믹스인(Mixins)은 Django Rest Framework(DRF)에서 제공하는 기능으로, View의 특정 동작을 재사용 가능한 방식으로 구성하는 데 사용됩니다. 믹스인은 클래스 기반 View(Class-Based Views, CBV)의 기능을 확장하고 커스터마이징하는 데 매우 유용합니다.

기본 CRUD 믹스인의 활용

DRF는 기본적으로 CRUD(Create, Read, Update, Delete) 작업을 수행하기 위한 믹스인을 제공합니다. 이러한 믹스인은 제네릭 View와 함께 사용되어, 각각의 CRUD 작업을 수행하는 View를 빠르게 생성할 수 있게 해줍니다.

**#views.py**
from rest_framework import mixins, generics
from .models import Animal
from .serializers import AnimalSerializer

class AnimalList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Animal.objects.all()
    serializer_class = AnimalSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

class AnimalDetail(mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   generics.GenericAPIView):
    queryset = Animal.objects.all()
    serializer_class = AnimalSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

#urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('animals/', views.AnimalList.as_view()),
    path('animals/<int:pk>/', views.AnimalDetail.as_view()),
]

이렇게 하면 각 View는 특정 CRUD 작업을 수행할 수 있게 됩니다.

 

커스텀 믹스인 작성하기

커스텀 믹스인을 작성하면, View의 동작을 커스터마이징하고 재사용할 수 있습니다. 커스텀 믹스인은 일반적으로 파이썬 클래스로 정의되며, View 클래스에 믹스인으로 추가됩니다.

**#views.py**
from rest_framework import mixins, generics
from .models import Animal
from .serializers import AnimalSerializer

class AnimalList(LoggingMixin, mixins.ListModelMixin, mixins.CreateModelMixin, 
generics.GenericAPIView):
    queryset = Animal.objects.all()
    serializer_class = AnimalSerializer

    def get(self, request, *args, **kwargs):
        self.log_request(request)
        response = self.list(request, *args, **kwargs)
        self.log_response(response)
        return response

    def post(self, request, *args, **kwargs):
        self.log_request(request)
        response = self.create(request, *args, **kwargs)
        self.log_response(response)
        return response

이렇게 믹스인을 활용하면, View의 동작을 모듈화하고 재사용할 수 있으며, View의 로직을 더욱 쉽게 조직화하고 확장할 수 있습니다. 믹스인은 DRF의 강력한 기능 중 하나로, View를 더욱 효율적이고 유지 관리가 쉽게 만들어줍니다.

5.7 믹스인(Mixins)

믹스인(Mixins)은 Django Rest Framework(DRF)에서 제공하는 기능으로, View의 특정 동작을 재사용 가능한 방식으로 구성하는 데 사용됩니다. 믹스인은 클래스 기반 View(Class-Based Views, CBV)의 기능을 확장하고 커스터마이징하는 데 매우 유용합니다.

기본 CRUD 믹스인의 활용

DRF는 기본적으로 CRUD(Create, Read, Update, Delete) 작업을 수행하기 위한 믹스인을 제공합니다. 이러한 믹스인은 제네릭 View와 함께 사용되어, 각각의 CRUD 작업을 수행하는 View를 빠르게 생성할 수 있게 해줍니다.

**#views.py**
from rest_framework import mixins, generics
from .models import Animal
from .serializers import AnimalSerializer

class AnimalList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Animal.objects.all()
    serializer_class = AnimalSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

class AnimalDetail(mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   generics.GenericAPIView):
    queryset = Animal.objects.all()
    serializer_class = AnimalSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

#urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('animals/', views.AnimalList.as_view()),
    path('animals/<int:pk>/', views.AnimalDetail.as_view()),
]

이렇게 하면 각 View는 특정 CRUD 작업을 수행할 수 있게 됩니다.

커스텀 믹스인 작성하기

커스텀 믹스인을 작성하면, View의 동작을 커스터마이징하고 재사용할 수 있습니다. 커스텀 믹스인은 일반적으로 파이썬 클래스로 정의되며, View 클래스에 믹스인으로 추가됩니다.

**#views.py**
from rest_framework import mixins, generics
from .models import Animal
from .serializers import AnimalSerializer

class AnimalList(LoggingMixin, mixins.ListModelMixin, mixins.CreateModelMixin, 
generics.GenericAPIView):
    queryset = Animal.objects.all()
    serializer_class = AnimalSerializer

    def get(self, request, *args, **kwargs):
        self.log_request(request)
        response = self.list(request, *args, **kwargs)
        self.log_response(response)
        return response

    def post(self, request, *args, **kwargs):
        self.log_request(request)
        response = self.create(request, *args, **kwargs)
        self.log_response(response)
        return response

이렇게 믹스인을 활용하면, View의 동작을 모듈화하고 재사용할 수 있으며, View의 로직을 더욱 쉽게 조직화하고 확장할 수 있습니다. 믹스인은 DRF의 강력한 기능 중 하나로, View를 더욱 효율적이고 유지 관리가 쉽게 만들어줍니다.

 

5.8 인증과 권한

Django Rest Framework(DRF) 내의 인증과 권한은 보안의 핵심 구성요소로 작용합니다. 인증은 사용자의 신원을 확인하는 단계이며, 권한은 인증된 사용자가 실행할 수 있는 동작을 결정합니다.

DRF의 인증 방법:

DRF는 여러 인증 방법을 제공합니다. 몇몇 주요 인증 방법은 아래와 같습니다.

  • 기본 인증(Basic Authentication): 기본 인증은 사용자 이름과 비밀번호를 이용해 사용자를 인증합니다.
  • 토큰 인증(Token Authentication): 토큰 인증은 사용자에게 고유한 토큰을 제공하고, 이 토큰으로 사용자를 인증합니다.
  • 세션 인증(Session Authentication): 세션 인증은 Django의 세션 프레임워크를 활용해 사용자를 인증합니다.
  • OAuth: OAuth는 외부 서비스를 통해 사용자를 인증하는데 사용됩니다.
  • 또한 인증 클래스를 만들어 사용자 정의 인증 방식을 구현할 수 있습니다.

권한 설정 및 사용 예

권한은 사용자가 수행할 수 있는 동작을 제어합니다. DRF는 다양한 권한 클래스를 제공하며, 사용자 정의 권한 클래스를 만들 수도 있습니다. 기본 권한 설정은 아래와 같습니다.

  • 모든 사용자 허용(AllowAny): 모든 사용자에게 접근을 허용합니다.
  • 인증된 사용자(IsAuthenticated): 인증된 사용자에게만 접근을 허용합니다.
  • 관리자 사용자(IsAdminUser): 관리자 사용자에게만 접근을 허용합니다.
  • 인증된 사용자 또는 읽기 전용(IsAuthenticatedOrReadOnly): 인증된 사용자에게만 쓰기 접근을 허용하고, 모든 사용자에게 읽기 접근을 허용합니다.
**#views.py**
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

class AnimalAuthenticatedView(APIView):
    permission_classes = [IsAuthenticated]

    def Animal(self, request):
        content = {'message': '이 메시지는 인증된 사용자만 볼 수 있습니다.'}
        return Response(content)

위 코드에서 View는 IsAuthenticated 권한 클래스를 사용하여 인증된 사용자에게만 접근을 허용합니다.

 

DRF 설명서 개념 때려잡기 : 인증과 권한

CustomPermission 클래스를 만들어 has_permission 메소드를 오버라이드함으로써 사용자 정의 권한 로직을 구현할 수 있습니다. 그런 다음 View에서 CustomPermission 클래스를 사용하여 권한을 적용할 수 있습니다.

**#views.py**
from rest_framework.views import APIView
from rest_framework.response import Response
from .permissions import CustomPermission

class AnimalCustomPermissionView(APIView):
    permission_classes = [CustomPermission]

    def get(self, request):
        content = {'message': 
'사용자 정의 권한을 통과한 사용자만 이 메시지를 볼 수 있습니다.'}
        return Response(content)

이러한 방식으로 DRF에서 인증과 권한을 설정함으로써, API의 보안을 강화하고 사용자의 접근을 제어할 수 있습니다.