시작
이번 포스트에서는 DRF(Django Rest Framework) 튜토리얼을 따라 Requests와 Responses를 다루는 방법을 알아보겠습니다. 본 포스트는 macOS와 VS Code 환경에서 진행됩니다.
본문
DRF에서 제공하는 객체
DRF는 Request 객체, Response 객체, Status codes 등을 제공하며 API 뷰를 작성하는 데 사용할 수 있는 두 가지 주요 래퍼를 지원합니다.
- 함수 기반 뷰를 위한
@api_view
데코레이터 - 클래스 기반 뷰를 위한
APIView
클래스
이러한 객체들을 사용하면 더 간결하고 효율적인 코드를 작성할 수 있습니다.
코드 개선
이제 Request 객체, Response 객체, Status codes를 사용하여 코드를 좀 더 개선해 보겠습니다.
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):
"""
모든 코드 snippet을 나열하거나 새로운 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_REQUEST)
위 코드는 @api_view
데코레이터를 사용하여 GET 요청과 POST 요청을 처리합니다.
다음은 개별 snippet을 조회, 수정, 삭제하는 뷰입니다.
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
특정 코드 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)
URL에 선택적 format
접미사 추가
format
키워드 인수를 추가하여 뷰에서 요청 형식을 처리할 수 있습니다.
def snippet_list(request, format=None):
def snippet_detail(request, pk, format=None):
또한 snippets/urls.py
파일을 업데이트하여 URL에 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)
동작 확인
이제 서버를 실행하고 다양한 형식의 요청을 통해 API가 어떻게 작동하는지 확인해 보겠습니다.
Json 요청
http http://127.0.0.1:8000/snippets/ Accept:application/json # Accept header 사용
http http://127.0.0.1:8000/snippets.json # formt 접미사 사용
[
{
"id": 1,
"title": "",
"code": "foo = \"bar\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 2,
"title": "",
"code": "print(\"hello, world\")\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 3,
"title": "",
"code": "print(\"hello, world\")",
"linenos": false,
"language": "python",
"style": "friendly"
}
]
API 요청
http http://127.0.0.1:8000/snippets/ Accept:text/html # Accept header 사용
http http://127.0.0.1:8000/snippets.api # formt 접미사 사용
이때 HTML 형식으로 요청을 보내면 브라우저에서 탐색 가능한 API 인터페이스가 제공됩니다.
마무리
이번 튜토리얼에서는 DRF가 제공하는 핵심 객체인 Request, Response, StatusCode를 활용해 API 뷰를 작성하는 방법을 살펴보았습니다. 이러한 객체들은 Django에서 확장된 기능을 제공하며 더 유연하고 직관적으로 사용할 수 있습니다. 앞으로 DRF를 사용할 때 API 개발을 보다 간단하게 할 수 있을 것 같습니다.
참고자료
'Django' 카테고리의 다른 글
DRF Tutorial 4 Authentication & Permissions (1) | 2024.09.14 |
---|---|
DRF Tutorial 3 Class-based Views (0) | 2024.09.14 |
DRF Tutorial 1 Serialization (0) | 2024.09.11 |
첫 번째 Django 앱 만들기 (Part 8: Adding third-party packages) (1) | 2024.09.02 |
첫 번째 Django 앱 만들기 (Part 7: Customizing the admin site) (0) | 2024.08.23 |
댓글