Django 기반으로 restful Interface를 따르는 Backend API를 만드는 프레임워크, DRF를 알아보자. 정확한 비교는 아니지만 spring <-> spring boot의 관계로 보는 사람이 많다.
Some reasons you might want to use REST framework:
RESTful(Representational State Transfer)에 대해 사전지식이 필요하다. NHN meetup! 글을 추천한다. REST API 제대로 알고 사용하기 그리고 우리 킹대협 형님의 REST API에 대한 글을 숙지하고 시작하자.
api gateway는 managed서비스 이기 때문에 여러가지 중요 기능들이 사용자도 모르는 사이에 이미 잘 구현되어 있다(validation이나 security같은 것들). 이걸 일일이 개발자가 구현해 api를 만든다고 하면 꽤나 복잡해진다. validation이나 security같은 고급 기능 없이 "flask"는 단순히 http request를 패싱해주는 기능만 한다. 여기에 validation이나 security기능들을 붙인다고 생각하면 개발자의 부담은 상당히 늘어나게 된다.
DRF는 라우터, 인증/권한, 데이터 규격화 (시리얼라이저), 필터/페이지네이션, 캐시, 쓰로틀, 렌더러, 테스트 등의 기능을 제공하며, 대체로 django 에서 제공하는 기능을 감싼 wrapper 형태로 되어있다.
규약(convention)이 많지만, 웬만한 것들은 설정(configuration)을 통해 원하는 형태로 구현할 수 있다. 규약과 규약에서 제공하는 설정 가능성을 존중하는 범주 안에서는 엄청난 생산성 레버리지 효과를 볼 수 있다.
# Create the project directory
mkdir tutorial
cd tutorial
# Create a virtual environment to isolate our package dependencies locally
python3 -m venv env
source env/bin/activate # On Windows use `env\Scripts\activate`
# Install Django and Django REST framework into the virtual environment
pip install django # 시리즈를 따라온다면, DRF만 설치하면 된다.
pip install djangorestframework
# Set up a new project with a single application
django-admin startproject tutorial . # Note the trailing '.' character -> 현재 디렉토리!
# tutorial 프로젝트 생성 완료, APP을 만들자!
cd tutorial
python manage.py startapp quickstart
cd ..
# VS code를 쓴다면, 위 cd .. 이후
code .
$ pwd
<some path>/tutorial
$ find .
.
./tutorial
./tutorial/asgi.py
./tutorial/__init__.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py
./db.sqlite3
./quickstart
./quickstart/migrations
./quickstart/migrations/__init__.py
./quickstart/models.py
./quickstart/serializers.py
./quickstart/__init__.py
./quickstart/apps.py
./quickstart/admin.py
./quickstart/tests.py
./quickstart/urls.py
./quickstart/views.py
./manage.py
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# DRF
'rest_framework',
'quickstart.apps.QuickstartConfig'
]
... # 생략
# DRF - restframwork config
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
# quickstart/models.py
from django.db import models
class Person(models.Model):
first_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=30)
quickstart/serializers.py
파일을 만들어 주고, 아래 코드를 추가한다. from django.contrib.auth.models import User, Group
from django.db.models import fields
from . import models
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'groups']
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ['url', 'name']
class PersonSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model=models.Person
fields='__all__'
User, Group
은 django.contrib.auth.models -> django.contrib.auth에 사용하는 model을 기반으로 시리얼라이즈 하는 것이다.from django.shortcuts import render
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
# import serializer And models
from quickstart.serializers import UserSerializer, GroupSerializer, PersonSerializer
from quickstart.models import Person
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
permission_classes = [permissions.IsAuthenticated]
class PersonViewSet(viewsets.ModelViewSet):
queryset = Person.objects.all()
serializer_class = PersonSerializer
api도 만들었고 이제 해당 api을 호출하는 url을 설정해주자. 즉 올바른 요청의 비즈니스로직을 호출할 수 있게 라우팅을 해주자.
그리고 프로젝트의 APP에 분산해서 관리하는 것을 처음부터 생각해서 도입하자.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('quickstart.urls')),
]
from django.urls import include, path
from rest_framework import routers
from quickstart import views
# DRF Router config
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'persons',views.PersonViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
path('', include(router.urls)), # add for API-ROOT test
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
python manage.makemigrations # person을 만들었기 때문
python manage.py migrate
python manage.py createsuperuser --email admin@example.com --username admin
python manage.py runserver
/api/<model>/<pk>
와 같은 url 접근으로 만든 모델의 인스턴스까지 바로 접근이 된다.