Django REST Framework/DRF 일반

[DRF] 공식 문서 - views의 정리 2 - CBV(APIView)

bluebamus 2024. 1. 8.

1. APIView

   - 기본적인 클래스로 자신의 마음대로 코드를 작성할 수 있지만, 그만큼 구현해줘야 하는 코드들이 많다. 

   - 여러개의 view 클래스를 만드는 경우 중복되는 코드들도 늘어난다.

   - 장점 : 

      1. 유연성 : DRF에서 제공하는 다양한 기능을 사용자가 직접 구현할 수 있으며 개발자는 필요한 기능을 자유롭게 커스터마이징 할 수 있다.

 

      2. 다양한 HTTP 메서드 지원: 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등)를 지원하며, 각 메서드에 대한 처리 로직을 개발자가 직접 구현할 수 있다. 이를 통해 API의 CRUD(Create, Read, Update, Delete)을 쉽게 구현할 수 있다.

 

      3. 요청 및 응답 처리를 위한 기본 지원: APIView는 들어오는 요청(self.request)을 처리하고 응답(self.response)을 구성하기 위한 내장 메서드를 제공한다. 이는 요청 데이터에 액세스하거나 적절한 상태 코드로 응답을 반환하는 등의 일반적인 작업을 단순화한다.

 

   - 단점 :

        1. 보일러플레이트 코드: 비슷한 기능을 가진 API 뷰에서 중복된 코드가 발생할 수 있다.

        2. 개발자의 책임 및 복잡성 : 개발자가 모든 기능을 직접 구현해야 한다는 점에서 책임이 강요되며 개발 시간과 노력이 요구된다. 개발자의 개발 능력에 따라 성능 및 코드의 복잡성이 확연하게 달라질 수 있다.

 

   - 기타 사항

      - 인증, 권한, 접근 속도 제한은 상속받은 클래스 함수로 정의할 수 있다.

      - queryset과 serializer은 상복받는 클래수 함수가 없다. 일반적으로 post, get 등의 내부 함수별로 구현한다.

      - APIview와 genericviews의 항목들은 list와 같이 pk가 없는 경우와 retrieve와 같이 pk가 필요한 경우에 대해 각각 다른 class와 url로 구현해야 한다.

 

   - http 메서드 구현 예시 :

from rest_framework import status

class CustomAPIView(APIView):
    # Overridden function for handling GET requests
    def get(self, request, *args, **kwargs):
        # Your custom logic for handling GET requests
        return Response({"message": "This is a GET request"}, status=status.HTTP_200_OK)

    # Overridden function for handling POST requests
    def post(self, request, *args, **kwargs):
        # Your custom logic for handling POST requests
        return Response({"message": "This is a POST request"}, status=status.HTTP_201_CREATED)

    # Overridden function for handling PUT requests
    def put(self, request, *args, **kwargs):
        # Your custom logic for handling PUT requests
        return Response({"message": "This is a PUT request"}, status=status.HTTP_200_OK)

    # Overridden function for handling DELETE requests
    def delete(self, request, *args, **kwargs):
        # Your custom logic for handling DELETE requests
        return Response({"message": "This is a DELETE request"}, status=status.HTTP_204_NO_CONTENT)

 

   - 오버라이딩 가능한 모든 함수 정리

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class CustomAPIView(APIView):
    # Lifecycle methods
    def initial(self, request, *args, **kwargs):
        # Called before any other method, used for any setup
        pass

    def handle_exception(self, exc):
        # Called when an exception is raised during the processing of a request
        pass

    # HTTP method overrides
    def get(self, request, *args, **kwargs):
        # Custom logic for handling GET requests
        return Response({"message": "This is a GET request"}, status=status.HTTP_200_OK)

    def post(self, request, *args, **kwargs):
        # Custom logic for handling POST requests
        return Response({"message": "This is a POST request"}, status=status.HTTP_201_CREATED)

    def put(self, request, *args, **kwargs):
        # Custom logic for handling PUT requests
        return Response({"message": "This is a PUT request"}, status=status.HTTP_200_OK)

    def patch(self, request, *args, **kwargs):
        # Custom logic for handling PATCH requests
        return Response({"message": "This is a PATCH request"}, status=status.HTTP_200_OK)

    def delete(self, request, *args, **kwargs):
        # Custom logic for handling DELETE requests
        return Response({"message": "This is a DELETE request"}, status=status.HTTP_204_NO_CONTENT)

    # Authorization and authentication
    def check_permissions(self, request):
        # Called to check if the request should be permitted
        pass

    def check_object_permissions(self, request, obj):
        # Called to check if the request should be permitted for a given object
        pass

    # Throttling and rate limiting
    def allow_throttle(self, request, view):
        # Called to check if the request should be throttled
        pass

    def get_throttles(self):
        # Returns a list of throttle instances applied to the view
        pass

    # Content negotiation
    def perform_content_negotiation(self, request, force=False):
        # Called to perform content negotiation and set the `accepted_renderer` and `accepted_media_type` attributes
        pass

    # Serialization
    def get_serializer(self, instance=None, data=None, many=False, partial=False):
        # Returns the serializer instance that should be used for validating and deserializing input, and serializing output
        pass

    def get_serializer_context(self):
        # Returns a dictionary containing any extra context that should be supplied to the serializer
        pass

 

   - 내부 함수 정리

      1. API 정책의 인스턴스화(Instantiation of API Policies):
          - get_renderers(self)
          - get_parsers(self)
          - get_authenticators(self)
          - get_throttles(self)
          - get_permissions(self)
          - get_content_negotiator(self)
          - get_exception_handler(self)


      2. 정책 시행 방법(Policy Implementation Methods):
          - check_permissions(self, request)
          - check_throttles(self, request)
          - perform_content_negotiation(self, request, force=False)


      3. 배송 방법(Dispatch Methods):
          - initial(self, request, *args, **kwargs)
          - handle_exception(self, exc)
          - initialize_request(self, request, *args, **kwargs)
          - finalize_response(self, request, response, *args, **kwargs)

 

      4. HTTP 방법 재정의(HTTP Method Overrides):
          - get(self, request, *args, **kwargs)
          - post(self, request, *args, **kwargs)
          - put(self, request, *args, **kwargs)
          - patch(self, request, *args, **kwargs)
          - delete(self, request, *args, **kwargs)


      5. 응답 생성 및 전송(Response Creation and Transmission):
          - HTTP 메서드 재정의에서 사용자 지정 논리를 실행한 후 Django REST 프레임워크에서 제공하는 Response 클래스를 사용하여 응답이 생성된다.
          - 응답 상태 코드와 데이터를 지정하여 응답이 클라이언트로 다시 전송된다.

 

 - 공식 사이트 문서 : https://www.django-rest-framework.org/api-guide/views/#class-based-views

 

Views - Django REST framework

 

www.django-rest-framework.org

 

 - reference : 

https://wikidocs.net/197563

 

03) DRF 뷰와 뷰셋

[TOC] ## DRF 뷰와 뷰셋 이 섹션에서는 Django REST Framework (DRF)의 뷰와 뷰셋에 대해 알아보겠습니다. DRF의 뷰는 API 엔드포인트의 동작…

wikidocs.net

https://hyeo-noo.tistory.com/314

 

[Django] DRF 구조 이해 #1 (APIView)

APIView는 DRF에서 사용하는 GenericAPIView, Viewset과 같이 편리하게 사용할 수 있는 api 라이브러리들의 기반이 되는 클래스이다. 참고:) APIView 클래스 전체 더보기 class APIView(View): # The following policies may

hyeo-noo.tistory.com

 

 

댓글