DRF tutorial 2: Requests and Responses를 읽고 정리한 글입니다.
DRF의 Request
와 Response
오브젝트를 이용하면 단 하나의 타입에만 맞추어 request와 response를 처리하지 않을 수 있다.
즉, json
타입의 request만 처리하거나 혹은 form
타입의 request만 처리하거나 하지 않고, 유효한 모든 타입의 request를 처리할 수 있다는 것이다.(단, 요청 data의 포맷이 정확하다는 가정 하에)
아래는 DRF 튜토리얼 문서의 view에 대한 코드이다.
@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(serializer.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)
여기서 request.data
는 클라이언트의 request에 담긴 json 포맷의 데이터 혹은 그 이외의 유효한 포맷의 데이터들을 처리할 수 있다.
또한 response 오브젝트도 data(여기서는 serializer.data)와 함께 반환하고 있으며 REST framework에게 response를 알아서 알맞은 타입으로 렌더링하도록 맡기고 있다.
format suffix를 사용하면
http://example.com/api/items/4.json
과 같이 말 그대로 형식 접미사가 붙은 URL로 API를 사용할 수 있다.
이를 가능하게 하기 위해선 아래와 같은 작업을 수행해야 한다.
format=None
추가하기def snippet_list(request, format=None):
format_suffix_patterns
추가하기from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views
urlpatterns = [
path('snippets/', views.snippet_list),
path('snippets/<int:pk>', views.snippet_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns)
이렇게 format suffix를 추가하면,
http://127.0.0.1:8000/snippet.json
형태의 URL을 이용한 API 사용이 가능해진다.