본문 바로가기
study/django

DRF(Django REST Framework) - APIView

by eunoia_DB 2024. 12. 22.

 

- DRF는 View 클래스를 상속한 APIView 클래스 제공

- 핸들러 메서드에 전달되는 요청 객체는 Django의 HttpRequest 인스턴스가 아닌 DRF의 Request 인스턴스이며,

   핸들러 메서드는 Django의 HttpResponse 대신 DRF의 Response 객체 반환

 

- APIView 클래스를 사용하는 것은 일반적인 View 클래스를 사용하는 것과 거의 동일하며 요청이 get() 또는 post()와 같은

  적절한 핸들러 메서드로 전달되는 방식이 같다

- APIView는 콘텐츠 협상(content negotiation)과 응답에 적절한 renderer 설정을 관리

    - 예를 들어, 클라이언트가 Accept: application/json을 설정하면, DRF는 데이터를 JSON 형식으로 변환하여 반환

    - renderer_classes를 명시적으로 지정하지 않으면, DRF는 JSONRenderer를 기본으로 사용하여 데이터를 JSON 형식으로 반환

 

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

class MyView(APIView):
    def get(self, request):
        data = {"message": "Hello, World!"}
        return Response(data)  # JSON 형식으로 반환

 

API policy attributes

클래스 속성으로 설정할 수 있는 항목

View ViewSet의 동작을 전역적으로 설정하는 데 사용되며 이를 통해 기본적인 동작이나 정책을 구성한다

 

주요 API policy attributes

-  permission_classes: 권한 정책 설정

-  authentication_classes: 인증 방식 설정

-  throttle_classes: 속도 제한 설정

-  renderer_classes: 렌더러 설정

-  parser_classes: 요청 본문을 파싱할 때 사용할 파서 설정

 

 

API policy methods

특정 동작을 제어하는 데 사용되는 메서드

이러한 메서드는 View ViewSet의 동작을 세부적으로 조정하거나, 동적 처리가 필요한 경우에 오버라이드하여 사용

 

주요 API policy methods

-  get_permissions(): 권한 확인 방식 동적으로 설정

-  get_serializer_class(): 요청에 따라 직렬화기 선택

-  get_queryset(): 요청에 맞춰 쿼리셋을 동적으로 반환

-  perform_create(): 객체 생성 후 추가 작업을 처리

 

 

APIView 예제

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import NotFound
from .models import Snippet
from .serializers import SnippetSerializer

class SnippetList(APIView):

    def get(self, request, format=None):
        snippet = Snippet.objects.all()
        serializer = SnippetSerializer(snippet, many=True)
        return Response(serializer.data)
    
    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class SnippetDetail(APIView):

    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise NotFound("Snippet not found.")
    
    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)
    
    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    def delete(self, request, pk, format=None):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

 

 

 

 

 


Reference

 

https://www.django-rest-framework.org/api-guide/views/#class-based-views

'study > django' 카테고리의 다른 글

Django, Nginx, Gunicorn을 활용한 Docker(Docker Compose) 배포  (1) 2024.12.13

댓글