728x90
반응형
Request, Response 객체, Status 모듈
Request 객체
- REST framework의 Request 객체는 HttpRequest 객체를 상속 받고 있음
- 더 유연한 request 파싱을 제공
- 코어 기능은 request.data임
- request.post는 오직 POST에서만 있음
request.POST # Only handles form data. Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
Response 객체
클라이언트에게 요청 받은 타입으로 리턴함
return Response(data) # Renders to content type as requested by the client.
Status 모듈
아래와 같이 HTTP Status를 나타냄
status.HTTP_400_BAD_REQUEST
API Views
API Views란?
- REST framework는 아래 두가지 방법으로 뷰를 사용함
- @api_view: function based views에 사용
- APIView: class based views에 사용
- 두 레퍼는 적절한 때에 405 Method Not Allowed responses 를 반환
- request.data에 대한 ParseError 도 핸들링 해줌
@api_view 작성
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_REQUEST)
@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)
Optional format suffixes 추가
- 해당 기능을 사용하면 http://example.com/api/items/4.json 처럼 json 형태로 데이터를 받을 수 있음
- 위 함수에 아래와 같이 format=None 추가
def snippet_list(request, format=None):
def snippet_detail(request, pk, format=None):
urls.py에 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)
테스트
아래 url로 접속
http http://127.0.0.1:8000/snippets/1.json # JSON suffix
http http://127.0.0.1:8000/snippets/1.api # Browsable API suffix
아래와 같이 나오는 것을 확인할 수 있다.
728x90
반응형
'Backend > Django' 카테고리의 다른 글
Django Tutorial 5: Relationships & Hyperlinked APIs (0) | 2024.03.12 |
---|---|
Django Tutorial 4: Authentication & Permissions (0) | 2024.03.10 |
Django Tutorial 3: Class-based Views (0) | 2024.03.10 |
Django Tutorial 1: Serialization (0) | 2024.03.10 |
DjangoRestFramework 프로젝트 세팅 (0) | 2024.03.09 |