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

0%

DRF Tutorial 6편 - Serializer 를 사용하는 Django 뷰

Serializer 를 사용하는 Django Views 사용하기


우리의 Serializer 클래스를 사용하는 몇가지 API 뷰들을 어떻게 작성하는지 봅시다.


현재까지 우리는, REST framework 의 그 어떤 다른 기능도 사용하지 않을것입니다. 우리는 그저 일반 Django views 와 같은 views 만 작성해 볼겁니다.


snippets/views.py 파일을 열고, 아래 내용을 추가해 줍니다.


1
2
3
4
5
from django.http import HttpResponse, JsonResponse 
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer

우리 API 의 기본은,

존재하는 모든 snippets 들을 리스팅 하거나, 혹은 새로운 snippet 을 생성하는것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@csrf_exempt 
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 JsonResponse(serializer.data, safe=False)

elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = SnippetSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)

우리는 이 views 에 클라이언트로부터 CRSF token 이 없는 POST 방식이 가능해야 하기 때문에,

해당 view 에 csrf_exempt 를 표시해 줍니다.


이것은 보통 원하지 않는 방식이고, REST framework view 는 사실 좀 더 이것보다 민감한것도 사용하기도 합니다. 어쨋거나, 지금은 우리의 목적을 수행 할것입니다.



Snippet 에 해당하는 view


또한, 우리는 각 snippet 에 해당하는 view 도 필요할것입니다.


이 view 는 snipept 을 조회, 업데이트 혹은 삭제 할때 쓸수 있습니다.


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
@csrf_exempt 
def snippet_detail(request, pk):
'''
Retrieve, update or delete a code snippet
'''
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return HttpResponse(status=404)

if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return JsonResponse(serializer.data)

elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = SnippetSerializer(snippet, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serailzier.data)
return JsonResponse(serializer.errors, status=400)

elif request.method == 'DELETE':
snippet.delete()
return HttpResponse(status=204)

urls.py


마지막으로, 이 view 들을 urls 에 묶어줘야 합니다. snippets/urls.py 파일을 생성합니다.


1
2
3
4
5
6
7
from django.urls import path 
from snippets import views

urlpatterns = [
path('snippets/', views.snippet_list),
path('snippets/<int:pk>/', views.snippet_detail),
]

우리는 root urlconf 에도 설정을 해주어야 합니다.


tutorial/urls.py 파일안에, 우리의 snippet app의 URL 을 포함시켜 줍니다.


1
2
3
4
5
from django.urls import path, include

urlpatterns = [
path('', incldue('snippets.urls'))
]

현재, 몇가지 사항들에 대해서는, 완벽하게 처리하고 있지는 않기는 합니다.


만약 우리가 망가진 json을 보내거나, 요청이 view 가 다룰수 없는 메서드로 만들어져 있으면, 우리는 500 “server error” 응답을 받을것입니다.


그렇지만, 일단 이것은 우리가 원하는 목적 안에서는 잘 작동할것 입니다.