웹 API를 만들기 위해 생성한 클래스의 인스턴스를 JSON 같은 형태로 직렬화 또는 반직렬화 할 수 있어야 한다.

1. 모델생성


# app/models.py
from django.db import models
class Post(models.Model):
  title = models.CharField(max_length=50)
  content = models.TextField()

  def __str__(self):
    return f'{self.title}'

포스트의 제목과 내용을 작성할 수 있도록 간단하게 구성하였다. 다음으로 migration작업을 진행한 뒤 Admin Page에서 포스트를 몇 개 생성한다.

2. Serializer 클래스 생성


# app/serializers.py
from rest_framework import serializers
from .models import Post, MyUser

class PostSerializers(serializers.ModelSerializer):
  class Meta:
    model = Post
    fields = ('id','title','content')
    # fields = '__all__' 와 동일
  • PostSerializer 클래스는 Post 모델의 정보들을 가져온다. Post 모델을 가져온다음, 위의 코드같이 몇 줄로 편리하게 사용하기위해 ModelSerializer 클래스를 사용한다.

3. 요청과 응답 처리


아래의 핵심요소들을 짚고 넘어간다.

Request objects

method(get,post,delete ...), data 로 요청을 보낸다. request 요청을 받으면 아래처럼 사용할 수 있다.

def PostView(request):
  if request.method == 'POST' 
      ...
  serializer = PostSerializers(data=request.data)

Response objects

요청을 받으면 그에 대한 응답을 리턴한다.

return Response(data) 

Status codes

HTTP 상태코드 위키백과
REST framewwork에서는 각 상태 코드에 대한 식별자를 제공한다.

return Response(status=status.HTTP_404_NOT_FOUND)

Wrapping API views

REST framewwork에서는 API Views를 작성하는 데 사용할 수 있는 데코레이터를 제공한다.

@api_view(['GET','POST']) # 함수형
def PostView(request):
  pass

class PostView(APIView): # 클래스형
  pass
  • GET, POST 요청에 대해서 처리하며 그 외 요청은 허용하지 않는다.

API 요청에 대한 응답 처리하기

from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view

from .models import Post
from .serializers import PostSerializers

@api_view(['GET','POST'])
def PostView(request):
  if request.method == 'GET':
    posts = Post.objects.all()
    serializer = PostSerializers(posts, many=True)
    return Response(serializer.data)

  elif request.method == 'POST':
    serializer = PostSerializers(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 외의 요청은 허용하지 않는다.
  • GET 요청일 경우 Post 모델의 쿼리셋을 Serializer화 하여 요청에 응답한다. (다수 쿼리셋을 serializer화 할 때 many=True 속성을 준다.)
  • POST 요청일 경우 Serializer 검증작업을 진행하고
    이상없으면 201 상태코드로 응답을 하고 검증에 문제가 생기면 400 상태코드로 응답을한다.

요청 url 생성

from django.urls import path
from . import views

urlpatterns = [
  path('posts/',views.PostView)
]