본문 바로가기
IT/Django

Django Rest Framework(DRF)를 이용한 API 뷰 구현

by Cyber_ 2024. 4. 8.

서론

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 개발자에게 필수적인 도구입니다.