django rest framework에서 rest api 구현하기

코딩하는범이·2021년 1월 13일
0
post-thumbnail

요즘에 사이드 프로젝트를 하는데, 파이썬으로 실행해야 하는 모듈이 있어서 django를 채택했다. 파이썬에서는 Flask 와 django가 웹 프레임워크로 유명한데 django가 복잡하긴 하지만 기능이 훨씬 뛰어나다고 해서 사용을 하게되었다.

문제는 내가 django를 일체 쓸줄 몰랐다는것. 스프링으로만 개발하다보니 구조를 이해하는게 많이 어려웠다. 오늘은 rest framework를 사용해서 rest api를 구현해 보는 코드를 볼것이다.

일단 django project를 생성한 후에 프로젝트 디렉토리에서 아래 명령어를 통해서 api app 을 하나 생성하자.

python manage.py startapp api

그리고 python 에다가 djangorestframework을 설치하자

pip install djangorestframework

자 그리고 우리는 이제 view가 아닌 Viewset을 사용할 것이고 router을 사용할 것이다. 설명은 아래 코드를 보면서 하도록 하겠다.

일단 Model과 serializer, viewset을 만들것이다.

Models.py

class Stock(models.Model):
    code = models.CharField(max_length=20)
    name = models.CharField(max_length=30)
    price = models.IntegerField()

    class Meta:
        db_table = 'stock'

    def __str__(self):
        return self.name

Stock이라는 모델을 하나 만들어보자!

serializers.py

from rest_framework import serializers
from .models import Stock


class StockSerializer(serializers.ModelSerializer):

    class Meta:
        model = Stock
        fields = '__all__'

Serializer은 Model로 부터 가져온 Json이나 xml 같은 형식으로 쉽게 변할 수 있게 해준다. 또한 format 형식도 변경 해 줄수있다.

viewsets.py

from rest_framework import viewsets
from . import models, serializers


class StockViewset(viewsets.ModelViewSet):
    queryset = models.Stock.objects.all()
    serializer_class = serializers.StockSerializer

viewset은 단일 클래스에서 관련있는 view들의 집합을 위해 logic의 결합을 허용한다. 말이 어려운데... 결국은 객체 목록 또는 하나의 객체 세부 정보를 얻기위해서 별도의 뷰를 일일이 만들 필요가 없다는 것이다. 그래서 get이나 post와 같은 method 핸들러를 제공 하지 않는다. 그러나 .list() 와 .create()와 같은 액션을 제공한다!

아래는 viewset에 관한 설명자료이다.

Viewsets 설명

api 디렉토리가 아닌 settings.py 가 있는 메인 디렉토리에서 router.py 를 생성하고 작성해보자.

from api.viewsets import StockViewset
from rest_framework import routers


router = routers.DefaultRouter()
router.get_api_root_view().cls.__name__ = "ASTS"
router.get_api_root_view().cls.__doc__ = "ASTS Api Service 목록"
router.register('stock',StockViewset)

라우터는 web framework로 들어오는 request를 핸들링해서 logic과 어플리케이션을 위한 URL을 어떻게 매핑할 건지 자동으로 결정하는 기능을 제공한다.

Router 설명

자 이제 router를 통해서 url을 맵핑해보자

urls.py 를 아래와 같이 세팅한다.

from django.contrib import admin
from django.urls import path,include
from .router import router

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]

그리고 app 을 실행해보자. localhost:8000/api 를 치면 rest framework가 제대로 나오는것이 보이고 생성,수정과 같은 메서드들이 모두 작동하는 것을 볼 수있다!!

profile
기록 그리고 기억

0개의 댓글