본문 바로가기

BE/Django

[django] REST API GET/POST 구현

인트로

안녕하세요. 오늘은 장고 DRF의 API GET/POST를 만들어 보겠습니다 :D 

장고DRF 에서 API 요청을 수행하려면 Serializer(시리얼라이저, 직렬화) 클래스를 선언해야 하는데요.

프로그래밍에서 직렬화는 데이터구조나 오브젝트 상태를 재구성 가능한 포맷으로 변환하는 과정을 말합니다.

자바에서 직렬화는 객체의 내용을 바이트 단위로 변환하여 파일 송수신을 수행하도록 하는 것인데요.

파이썬 기반 장고에서 직렬화는

객체의 내용을 JSON/XML로 변환하여 Request/Response에 대응할 수 있도록 하는 과정을 의미합니다. 

 

 

1. 환경 세팅

django API를 구축하기 전, DRF(django rest framework) 를 장고 프로젝트에 설치해야 합니다. 

아래와 같이 pip명령어를 이용해 djangorestframeworkf를 설치해주세요. 

pip install djangorestframework

이후 project 폴더에 있는 settings.py의 INSTALLED_APPS 필드에 'rest_framework'를 추가합니다. 

setting.py 

INSTALLED_APPS = [
	#...
    'rest_framework',
    #...
]

 

 

2. urls.py

urls.py 에 View에 매핑될 URL 을 정의 합니다. 

/get : API GET 요청을 받아 실행될 URL 입니다.

/post : API POST 요청을 받아 실행될 URL 입니다.

 

from django.urls import path, include
from . import views

app_name = 'posts'

urlpatterns = [
    path('', views.index),
    path('/get',views.get_api),
    path('/post', views.post_api)
]

 

 

3. models.py

models.py 에 요청이 오면 반환할 객체 모델을 만들어 주세요.  

모델은 다음과 같이 Post라는 이름으로 선언하였습니다.

Post(post_id, title, content, writer, created_at, updated_at, deleted_at) 
from django.db import models

class Post(models.Model):
    post_id = models.IntegerField(),
    title = models.CharField(max_length=1000),
    content = models.CharField(max_length=1000),
    writer = models.CharField(max_length=1000),
    created_at = models.DateTimeField(),
    updated_at = models.DateTimeField(),

 

4. serializer.py

Serialize는 한글로 '직렬화'라는 의미입니다.

장고에서 Serializer는 모델 인스턴스와 같은 구조를 JSON/XML로 변환하는 역할을 합니다. 

즉, 장고 모델 객체를 Serializer를 통해  Request/Response에 적합한 포맷인 JSON/XML로 바꾸는 것입니다. 

객체 <> JSON/XML 로 바꾸는 과정은 serializer.py를 통해 수행되는 데 , 앱 구성에 포함되어 있지 않으므로 별도로 생성해야 합니다. 

django 프로젝트 > 앱 폴더 내 serializer.py 를 생성해주세요. 

 

이후 django.core / rest_framework 의 serializers 를 임포트 하고, 다음과 같이 serializers를 선언해주세요. 

· serializers.ModelSerializer : ModelSerializer 클래스는 create,update 를 내장하고 있어 따로 선언해 줄 필요가 없습니다. 

· input_formats = ['%Y-%m-%d']  : Serializer DatetimeField 의 입력 형식을 지정합니다. 

from django.core import serializers
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['post_id', 'title', 'content', 'created_at']
    post_id = serializers.CharField(max_length=100)
    title = serializers.CharField(max_length=100)
    content = serializers.CharField(max_length=100)
    created_at = serializers.DateTimeField(input_formats=["%Y-%m-%d"])

 

5. views.py GET/POST 구현

이제 views.py 에 get/post 요청에 매핑되는 뷰 함수를 구현해 보겠습니다. 

get_api 함수는 GET요청에 따라 Post 데이터를 리턴하며, post_api 함수는 들어온 데이터를 db에 저장하는 함수입니다. 

 

1) def get api(request) : GET요청이 들어오면 Post모델 데이터를 직렬화하여 JSON/XML로 응답하는 함수입니다. 

흐름 : db(object) -> serializer -> response(json/xml) 

 

2) def post_api(request) : POST요청이 들어오면 요청 데이터를 Serializer를 사용해 객체화하여 DB에 담는 함수입니다. 

흐름 : request(json/xml) -> serializer -> db(object)

 

from django.shortcuts import render

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from django.http.response import HttpResponse
from .models import Post
from .serializers import PostSerializer 

@api_view(['GET'])
def get_api(request):
    posts = Post.objects.all()
    serailized_posts= PostSerializer(posts, many=True)
    return Response(serailized_posts.data)

@api_view(['POST'])
def post_api(request):
    if request.method == 'GET':
        return HttpResponse(status=200)
    if request.method == 'POST':
        serializer = PostSerializer(data = request.data, many=True)
        if(serializer.is_valid()):
            serializer.save()
            return Response(serializer.data ,status=200)
        return Response(serializer.errors ,status=status.HTTP_400_BAD_REQUEST)