Django restframework - DRF

정현우·2021년 10월 23일
3

Django Basic to Advanced

목록 보기
16/39

Django DRF

Django 기반으로 restful Interface를 따르는 Backend API를 만드는 프레임워크, DRF를 알아보자. 정확한 비교는 아니지만 spring <-> spring boot의 관계로 보는 사람이 많다.

Django restframework

공식 문서 글을 빌리며

  • Some reasons you might want to use REST framework:

    1. The Web browsable API is a huge usability win for your developers.
    2. Authentication policies including packages for OAuth1a and OAuth2.
    3. Serialization that supports both ORM and non-ORM data sources.
    4. Customizable all the way down - just use regular function-based views if you don't need the more powerful features.
    5. Extensive documentation, and great community support.
    6. Used and trusted by internationally recognised companies including Mozilla, Red Hat, Heroku, and Eventbrite.
  • 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)을 통해 원하는 형태로 구현할 수 있다. 규약과 규약에서 제공하는 설정 가능성을 존중하는 범주 안에서는 엄청난 생산성 레버리지 효과를 볼 수 있다.

구조

  • 크게 보면 위와 같다. REQUEST -> URL -> View(비즈니스 로직) -> Serializer -> Modes (DB) ~ RESPONSE 의 큰 흐름을 가진다.

Serializer

  • Serializer는 Django Rest Framework에서 나온 새로운 요소입니다. 사전적 의미는 직렬화 하는 무언가 정도로 볼 수 있습니다. 직렬화라는 말이 와닿지 않는데, 이는 간단하게 파이썬 데이터를 JSON 타입의 데이터로 변환해준다 정도로 생각하시면 됩니다. => 쿼리셋, 모델 인스턴스 등의 복잡한 데이터를 JSON, XML 등의 컨텐트 타입으로 쉽게 변환 가능한 python datatype으로 변환시켜준다!

DRF quick stark-up

  • 우선 DRF 구축과 환경 세팅을 시작하자. DRF를 위해 이 시리즈에서 Django로 초석을 깔았다. 우린 공식 문서 기준으로, tutorial project 부터 해보자.

install

# 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

setting config

  • setting에 drf와 만든 APP을 추가해줘야 한다.
# 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
}

  • 위 설정에서 Pagination을 통해서 한번에 얼마나 많은양의 list 값을 return해줄지 설정할 수 있다!

model

# 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)

Serializers

  • 바로 모델을 만들고, '직렬화'라는 것을 해보자. 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을 기반으로 시리얼라이즈 하는 것이다.

Views

  • model을 만들고 시리얼라이즈를 세팅했으니, API를 만들어 보자
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

URLs

  • api도 만들었고 이제 해당 api을 호출하는 url을 설정해주자. 즉 올바른 요청의 비즈니스로직을 호출할 수 있게 라우팅을 해주자.

  • 그리고 프로젝트의 APP에 분산해서 관리하는 것을 처음부터 생각해서 도입하자.

먼저 tutorial/urls

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

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

quickstart/urls.py

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'))
]
  • DRF에서는 viewset을 받아 url에 자동으로 매핑해주는 router라는 함수가 있어 편리하게 url을 생성할 수 있다.

start

  • 마이그레이션과 우리가 auth models을 사용하니, auth model도 동시에 만들어보자
python manage.makemigrations # person을 만들었기 때문
python manage.py migrate
python manage.py createsuperuser --email admin@example.com --username admin
python manage.py runserver

  • 위와 같이 뜨면 성공이다. 우린 quickstart/urls.py에서 routers를 통해 ROOT에 위와 같이뜨게 register해두었엇다. admin으로 로그인해보자! 그리고 위 사진 - API ROOT에서 할당된 url을 클릭해서 접근해보자!

  • 위는 admin2를 입력폼을 통해 테스트하고 list를 다시 get한 것이다!

  • 여기서 느껴지겠지만, 기본적으로 GET, POST, HEAD, OPTIONS 메소드로 우리가 만든 API에 접근이 가능하며, /api/<model>/<pk>와 같은 url 접근으로 만든 모델의 인스턴스까지 바로 접근이 된다.

  • 그리고 해당 url을 request로 받아서, 해당 모델 인스턴스에 대해 RUD가 바로 가능하다! PUT, PATCH, DELETE를 통해서 말이다..!! 이게 진짜 신세계급 간편함, 편리함이다,,,
profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글