[DRF] 공식 문서 - views의 정리 2 - CBV(APIView)
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
- reference :
https://hyeo-noo.tistory.com/314
'Django REST Framework > DRF 일반' 카테고리의 다른 글
[DRF] 공식 문서 - views의 정리 4 - CBV(Mixins) (0) | 2024.01.10 |
---|---|
[DRF] 공식 문서 - views의 정리 3 - CBV(Generic views) (0) | 2024.01.10 |
[DRF] 공식 문서 - views의 정리 1 - FBV(api_view) (0) | 2024.01.08 |
[DRF] CSRF, csrf_exempt 에 대한 정리. (0) | 2024.01.07 |
[DRF] settings.py 자주 사용 되는 구성 옵션의 정리 (0) | 2024.01.05 |
댓글