- 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 |
---|
댓글