서론
Django Rest Framework (DRF)는 Django에서 RESTful API를 구축하는 데 필수적인 도구입니다. 이번 포스팅에서는 DRF를 사용하여 API 뷰를 구현하는 기본적인 방법을 소개합니다.
DRF 의 중요성
DRF는 데이터 직렬화, 요청 처리, 권한 관리 등 API 개발에 필요한 다양한 기능을 제공합니다.
API 뷰 구현
APIView 클래스를 상속하여 기본적인 CRUD (Create, Read, Update, Delete) 기능을 구현할 수 있습니다. ListCreateAPIView와 RetrieveUpdateDestroyAPIView는 각각 리스트 생성 및 개별 객체에 대한 조회, 수정, 삭제 기능을 제공합니다.
실제 예제
from rest_framework.generics import ListCreateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.parsers import FormParser
from rest_framework.parsers import MultiPartParser
from rest_framework.response import Response
from drf_spectacular.utils import extend_schema
from common.paginations import CustomPagination
# from core.paginations import CustomPaginatorInspectorClass
from ..models import Product
from ..serializers import ProductListSZ
from ..serializers import ProductCreateSZ
from ..serializers import ProductUpdateRequestSZ
from ..serializers import ProductResponseSZ
class ProductListCreateAV(ListCreateAPIView):
pagination_class = CustomPagination
queryset = Product.objects.all()
http_method_names = ['get', 'post']
parser_classes = (MultiPartParser, FormParser)
def get_serializer_class(self):
if self.request.method == 'GET':
return ProductListSZ
elif self.request.method == 'POST':
return ProductCreateSZ
def get(self, request, *args, **kwargs):
page = self.paginate_queryset(self.get_queryset())
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(data=serializer.data)
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.POST)
if serializer.is_valid():
serializer.save(
image=request.data.get('image')
)
serializer.save()
return Response(serializer.data)
raise ValueError()
class ProductRetrieveUpdateDestroyAV(RetrieveUpdateDestroyAPIView):
serializer_class = ProductUpdateRequestSZ
queryset = Product.objects.all()
http_method_names = ['get', 'patch', 'delete']
parser_classes = (FormParser, MultiPartParser)
def get_serializer_class(self):
if self.request.method == 'GET':
return ProductListSZ
elif self.request.method == 'PATCH':
return ProductUpdateRequestSZ
return self.serializer_class
@extend_schema(
responses=ProductListSZ,
)
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
@extend_schema(
responses=ProductUpdateRequestSZ,
)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
ProductListCreateAV 클래스
이 클래스는 ListCreateAPIView를 상속받아, 상품 목록을 보여주고 새로운 상품을 생성하는 API 엔드포인트를 구현합니다.
Attributes:
- pagination_class: API 응답에서 사용할 페이지네이션 클래스.
- queryset: Product 모델의 모든 객체를 가져오는 쿼리셋.
- http_method_names: 이 뷰에서 허용되는 HTTP 메소드. 여기서는 'get'과 'post'만 허용됩니다.
- parser_classes: 요청 데이터를 파싱하는 데 사용되는 파서 클래스들.
Methods:
- get_serializer_class: HTTP 메소드에 따라 사용할 직렬화 클래스를 반환합니다. 'GET' 요청에는 ProductListSZ를, 'POST' 요청에는 ProductCreateSZ를 사용합니다.
- get: 상품 목록을 조회하는 메소드. 페이지네이션을 적용하고 결과를 직렬화하여 반환합니다.
- post: 새로운 상품을 생성하는 메소드. 유효성 검사를 거쳐 상품 데이터를 저장하고 응답합니다.
ProductRetrieveUpdateDestroyAV 클래스
이 클래스는 RetrieveUpdateDestroyAPIView를 상속받아, 특정 상품의 조회, 수정, 삭제 기능을 구현합니다.
Attributes
- serializer_class: 기본 직렬화 클래스.
- queryset: Product 모델의 모든 객체를 가져오는 쿼리셋.
- http_method_names: 'get', 'patch', 'delete' 메소드를 허용합니다.
- parser_classes: 요청 데이터 파싱에 사용됩니다.
Methods:
- get_serializer_class: HTTP 메소드에 따라 다른 직렬화 클래스를 반환합니다.
- get: 특정 상품의 세부 정보를 조회합니다.
- patch: 특정 상품을 수정합니다.
- delete: 특정 상품을 삭제합니다.
각 메소드의 @extend_schema
OpenAPI 스키마 문서에 대한 설명을 추가, DRF의 @swagger_auto_schema와 유사한 기능을 가지며 API문서를 자동으로 생성하는데 도움을 줍니다.
장점
간결하고 구조화된 코드로 빠르게 API를 구현할 수 있습니다.
결론
DRF는 Django에서 효율적이고 강력한 API를 구축하는 데 중요한 역할을 합니다. RESTful API 개발에 관심이 있는 Django 개발자에게 필수적인 도구입니다.
'IT > Python' 카테고리의 다른 글
Django, foreignkey error - 무결성에 문제가 없더라도 migrations 폴더와 pycache에 문제가 없는지 살펴보기 (0) | 2024.04.12 |
---|---|
Django, 서드파티 앱에 대해서 (0) | 2024.04.08 |
Django, 테스트코드 작성법 (1) | 2024.04.07 |
Django와 라즈베리파이 이용한 실시간 영상 스트리밍 서버 구축(MQTT 프로토콜) (0) | 2024.04.07 |
Django, MVT 패턴외에 다른 패턴이 사용 가능할까? (0) | 2024.04.07 |