Django - RESTful 한 API 만들기
Web/Django

Django - RESTful 한 API 만들기

뉴비뉴 2020. 4. 21.

안녕하세요.

 

평소 Django REST Framework를 이용하여 API를 만드는데

개념이 안잡혀있는 듯한 느낌이 강해서 한번 복습할 겸 내용을 정리해보려고 합니다.

 

그 전에 간단하게 테스트할 수 있는 코드를 작성해보겠습니다.

 

api/ 폴더 안에 list.py를 생성해주겠습니다.

list.py

from django.views.generic import View
from django.http.response import HttpResponse


class PostListAPIView(View):

    def get(self, request, *args, **kwargs)

        return HttpResponse('Hello World')

urls.py

urlpatterns = [
    path('posts/', PostListAPIView.as_view(), name='list')
]

간단하게 /api/posts/ 라는 URL로 GET 요청 시 HttpResponse로 'Hello World' 가 출력되는 코드입니다.

보시면 View라는 것을 상속받아 사용하고 있습니다.

def get(self, request, *args, **kwargs):
	data = {
    	"Hello": "World",
    }
    return HttpResponse(data)
    
 # 위와 같이 data를 HttpResponse로 넘겨주게 되면 우리가 원하는 값이 제대로 나오지 않습니다.
 
 import json
 
 	return HttpResponse(
    	json.dumps(data),  # json.dumps를 이용하면 Dict -> Json으로 바뀐다.
        content_type="application/json",
    )
    
# 그렇다면 게시글의 목록들을 가져와서 데이터를 만들어보겠습니다.

def get(self, request, *args, **kwargs):
	data = [
    	{
            "title": post.title,
            "content": post.content,
            "youtube_original_url": post.url
        }
        for post in Post.objects.all()
    ]
    
# 위와 같은 코드를 돌려보면 Post 객체 값이 들어가게 됩니다.

위 코드에는 몇 가지 단점이 있습니다.

 

1. application/json -> json 형식으로만 데이터를 받을 수 있습니다. 

2. json을 serializer하고 deserializer 할 때 data를 수동으로 변경해줘야합니다. 

 

Django Rest Framework

- API 만드는데 최적화

- Django의 View 만큼이나 복잡하다.

 

pip install djangorestframework

INSTALLED_APPS = [ 'rest_framework' ]

 

from rest_framework.views import APIView
from rest_framework.response import Response


class PostListAPIView(APIView):
	def get(self, request, *args, **kwargs):
    	data = [
    	{
      	    "title": post.title,
            "content": post.content,
            "youtube_original_url": post.url
        }
        for post in Post.objects.all()
    ]
    return Response(data)

APIView와 Response를 변경해주었는데 Django REST framework에서 기본적으로 제공해주는 템플릿이 생성되었고,

Postman으로 request 시 데이터도 정확히 잘 나오는 것을 확인할 수 있습니다.

from rest_framework.generics import ListAPIView
from posts.serializers import PostModelSerializer


class PostListAPIView(ListAPIView):
    queryset = Post.objects.all()

# ListAPIView는 기본적으로 queryset or get_queryset, serializer_class 가 필요합니다.
# serializers 폴더를 생성해주고, 안에 파일을 생성합니다.

# serializers/post.py
from rest_framework.serializer import serializer


class PostModelSerializer(serializer.ModelSerializer):

    username = serializers.CharField(source='user.username')  # user.username을 추가
    
    class Meta:
    	model = Post
        fields = ['title', 'content']

위 코드로 실행하게 되면 Post 모델에 있는 fields에 지정한 필드들이 Serializer되어서 json 객체로 출력 됩니다.

댓글

💲 추천 글