당신은 멋쟁이, 우리는 장고쟁이~

0%

DRF Tutorial 15편 - 클래스 기반 뷰

Class based view


우리는 우리의 API 뷰들을 함수 기반 대신에 클래스 기반 뷰들을 이용하여 작성할수도 있습니다.


우리는 이것은 공통된 기능들을 재사용하고, 반복적이지 않게 하는 강력한 패턴으로 볼수 있습니다. 코드를 DRY 하게 해줄수 있습니다 (DRY 는 Don’t Repeat Yourself 의 약자).


Rewriting our API using class-based views


우리의 기존 뷰를 클래스 기반 뷰로 다시 작성하는것부터 시작을 할것 입니다.


이 모든것은 snippets/views.py 를 조금씩 리팩토링 해주면서 진행 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from snippets.models import Snippet 
from snippet.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status


class SnippetList(APIView):
"""
List all snippets, or create a new snippet.
"""
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, 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)

여기까지 아주 좋습니다. 이전과 꽤 비슷해 보입니다만, 우리는 다른 HTTP 메서드들을 사이에 두고 구분을 짓고 있습니다. 우리는, 우리의 인스턴스 뷰도 업데이트 해줄 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class SnippetDetail(APIView):
"""
Retrieve, update or delete a snippet instance.
"""
def get_object(self, pk):
try:
return Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
raise Http404

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)

여기까지도 좋아 보입니다. 다시 한번, 코드는 여전히 함수 기반 뷰와 꽤나 비슷합니다. snippets/urls.py 또한 클래스 기반 뷰를 사용하기 위해서, 살짝 리펙터를 해줘야 합니다.


1
2
3
4
5
6
7
8
9
10
from django.urls import path 
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = [
path('snippets/', views.SnippetList.as_view()),
path('snippets/<int:pk>/', views.SnippetDetail.as_views()),
]

urlpatterns = format_suffix_patterns(urlpatterns)