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

0%

DRF Tutorial 11편 - Pulling it all together

Pulling it all together


이제 더 앞으로 나아가서, 새로운 컴포넌트를 사용하여 우리의 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
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@api_view(['GET', 'POST'])
def snippet_list(request):
"""
List all code snippets, or create a new snippet
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
elif request.method == "POST":
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_REQEUST)

우리의 인스턴스 뷰는 지난 예시보다 조금 향상되었습니다. 조금 더 간결하고, 코드는 이제 Forms API 와 작업하는것과 더 많이 비슷한 느낌입니다. 우리는 또한, 이름을 가진 상태값들을 사용하여, 응답들이 의미하는바를 좀 더 명확하게 해줍니다.


개별 snippet 에 대한 뷰는 아래의 예시처럼 고쳐줍니다. snippet/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
24
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
Retrieve, update or delete a code snippet.
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)

if request.method == "GET":
serializer = SnippetSerializer(snippet)
return Response(seriazlier.data)

elif request.method == "PUT":
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)

elif request.method == 'DELETE':
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

이는 충분히 친근하게 느껴야 합니다 - 일반 Django views 들을 작업하는것과 많이 다르지 않습니다.


우리는 이제 더이상 주어진 컨텐트 종류에 request 혹은 response 들을 묶어주지 않는다는것을 알아 차려야 합니다. request.data 는 들어오는 json 요청들을 다룹니다. 하지만, request.data 는 다른 포멧들을 다룰수 있습니다.


비슷한 방식으로 우리는 데이터를 가진 응답 객체들을 반환하고 있습니다만, REST framework 가 응답을 맞는 형태의 컨텐트 타입을 렌더하게 해줍니다.