일하는/Cloud, Web

Django REST Framework : Tutorial (2)

김논리 2020. 8. 31. 16:36

https://ungodly-hour.tistory.com/19

 

Django REST Framework : Tutorial (1)

Django Django는 Python으로 작성된 오픈 소스 웹 애플리케이션 프레임워크로, 풀 스택을 지원한다. Python 기반의 웹 프레임워크 중 가장 널리 사용되고 있으며, 일반적으로 Python을 웹 서비스에 사용한

ungodly-hour.tistory.com


 

이번 튜토리얼에서는 사용자 및 그룹 정보를 추가(Create-POST)/조회(Read-GET)/수정(Update-PUT)/삭제(Delete-DELETE) 할 수 있는 애플리케이션을 만들어 보자.

 

Model

우선, 가장 먼저 우리가 구현할 애플리케이션에서 사용되는 Resource에 대한 DB 모델을 설계한다. 일반적으로 하나의 모델은 하나의 데이터베이스 테이블에 매핑되며, 하나의 애플리케이션에서 여러 개의 모델을 사용할 수 있다. 또한 여러 개의 모델을 사용하는 경우, 각 모델 간의 관계(Relation)를 정의하여 사용할 수도 있다.

 

사용자 및 그룹 정보는 다음과 같이 구성되어 있다고 가정하자.

  • User: username, email, groups
  • Group: name

 

이 튜토리얼에서는 위와 같은 정보를 위해 새로운 모델을 생성하지 않고, Django에서 제공하는 사용자/그룹 모델을 이용해 보자. 모델에 관련된 자세한 내용은 아래 페이지에서 확인이 가능하다.

 

https://docs.djangoproject.com/en/3.1/ref/contrib/auth/

 

django.contrib.auth | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

직접 모델을 만들어 사용할 경우, myapp/models.py 파일을 수정하여 사용하면 된다.

 

Serializers

Serializer는 Django Model에 의해 정의된 데이터를 보다 쉽게 전송 가능한 형식인 JSON 또는 XML 등의 형식으로 변환하는 것을 도와주는 역할을 한다. DRF에서 제공하는 기능이며, Django에서 제공하는 Form과 비슷한 역할을 수행한다고 보면 된다. (DRF에서 제공하는 기능이므로, Django 애플리케이션 생성 시 파일이 자동으로 생성되지 않는다.)

 

위에서 언급한 것과 같이 우리는 User 모델에서는 username, email, groups, Group 모델에서는 name 필드만 사용할 것이다. 애플리케이션 디렉토리(myapp) 하위에 serializers.py라는 모듈을 생성한 뒤, 다음과 같이 작성해 보자.

 

from django.contrib.auth.models import User, Group
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']

 

User 모델과 Gruop 모델 간의 관계를 정의하기 위해 HyperlinkedModelSerializer를 사용하였다. Primary Key와 같은 다양한 방법으로 관계를 설정할 수 있지만, 하이퍼링크 관계를 RESTful 디자인에 가장 잘 어울리는 관계라고 할 수 있다. 또한 모델에서 사용할 필드를 Serializer에 알려주는 것을 확인할 수 있다. (url은 해당 resource에 대한 url로, 하이퍼링크 관계에 사용됨.)

 

Views

View에서는 실제 API에서 제공하는 기능들에 대한 로직을 정의한다. 다시 말해, Client로 부터 Request를 받고, Client에게 줄 Response를 생성한다. Django에서는 함수 기반의 View, 클래스 기반의 View, 클래스 기반의 View를 추상화시킨 Viewset 등 다양한 형태의 View를 제공하고 있다. 이 튜토리얼에서는 Viewset을 이용하여 적은 양의 코드로 View를 만들어 보자. myapp/views.py 파일을 다음과 같이 수정한다.

 

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from quickstart.serializers import UserSerializer, GroupSerializer
 
 
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
 
 
class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

 

Viewset은 여러 개의 뷰의 논리적인 관계로 결합하여 하나의 그룹으로 관리하도록 한다.

queryset (GET/POST/PUT/DELETE)과 serializer_class (Request/Response data)를 설정하는 것만으로도 각 method에 대한 API 로직 구현을 완성할 수 있다. (이 예제에서는 querysetserializer_class를 명시적으로 선언하였으나, 일반적인 경우 model만 설정하면 해당하는 querysetserializer_class가 자동으로 설정된다.)

 

 

URLs

이제 API를 위한 URL을 설정한다. URL은 프로젝트 단위로 관리되며, 필요한 경우 애플리케이션 디렉토리 내 urls.py 파일을 별도 생성하여 애플리케이션 별로 관리할 수도 있다. myproject/urls.py 파일을 다음과 같이 수정한다.

 

from django.urls import include, path
from rest_framework import routers
from quickstart import views
 
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
 
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path(r'', include(router.urls)),
]

 

Viewset을 사용하였기 때문에, Router 클래스에 Viewset을 등록하고, API에 대한 URLconf를 자동으로 생성하였다. 만약, API URL을 다르게 설정하고 싶다면, 일반 View (함수 기반 혹은 클래스 기반)를 사용하고, URLconf를 명시적으로 연결하여 사용하면 된다.

 

 

Settings

이제 애플리케이션을 구동하기 위해, 우리가 사용한 DRF를 Django 프로젝트에 추가해 보자. (DRF는 Django에서 기본으로 제공하는 패키지가 아니므로, 별도 추가가 필요하다.) myproject/settings.py 파일에 다음과 같이 추가한다.

 

INSTALLED_APPS = [
    ...
    'rest_framework',
]

 

아래와 같이 해당 파일에 DRF를 위한 별도 설정도 추가할 수 있다. (하지만, 이 튜토리얼에서는 별도 설정을 추가하지 않는다.)

 

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',),
    'PAGINATE_BY': 10
}

 

아주 간단하게 REST API 서버 구현이 완료되었다!

 


https://ungodly-hour.tistory.com/21

 

Django REST Framework : Tutorial (3)

https://ungodly-hour.tistory.com/20 Django REST Framework : Tutorial (2) https://ungodly-hour.tistory.com/19 Django REST Framework : Tutorial (1) Django Django는 Python으로 작성된 오픈 소스 웹 애플..

ungodly-hour.tistory.com