[DRF 튜토리얼] 2. Requests and responses

HL·2021년 1월 21일
0

Django

목록 보기
11/15

Request object

  • HttpRequest extended 버전
  • 더 유연한 request 파싱
  • 핵심은 request.data
    - request.POST와 유사 but more useful
    • request.POST는 form 데이터만 다룸. POST 메소드만 가능
    • request.data 더 많은 데이터. POST, PUT, PATCH 가능

Response object

  • client가 요청한 타입으로 render

Status codes

  • 좀 더 명확하게 하기 위해 직접 숫자로 쓰지 않고 DRF에서 제공
  • ex) HTTP_400_BAD_REQUEST

Wrapping API views

  • @api_view 데코레이터 : function based view
  • APIView 클래스 : class based view
  • make sure, add context 하는 효과
  • 적절하게 return '405 Method Not Allowed' response 하는 효과
  • 잘못된 입력에 대해 ParseError exception을 일으킴

View 수정

  • 데코레이터 추가
  • JsonResponse -> Response
  • 직접 request 파싱 -> request.data
  • status code 수정
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)

url에 포맷 접미사 추가

def snippet_list(request, format=None):
def snippet_detail(request, pk, format=None):
  • urls.py 수정
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)

테스트 명령어

Accept 헤더 추가

http http://127.0.0.1:8000/snippets/ Accept:application/json  # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html         # Request HTML

format suffix 추가

http http://127.0.0.1:8000/snippets.json  # JSON suffix
http http://127.0.0.1:8000/snippets.api   # Browsable API suffix

Content-Type 헤더 추가

# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print(123)"

# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print(123)"
  • --debug 옵션을 추가하면 request 헤더에서 request type을 확인할 수 있음

링크

https://www.django-rest-framework.org/tutorial/2-requests-and-responses/#wrapping-api-views

profile
Swift, iOS 앱 개발을 공부하고 있습니다

0개의 댓글