DRF 예제를 계속 이어나가보자.

 

2021.10.12 - [Python/DRF] - DRF 개념 정리

2021.10.12 - [Python/DRF] - DRF Example 01. 프로젝트 생성

2021.10.12 - [Python/DRF] - DRF Example 02. Serializer & Views & URLs & Pagination & setting

 

이번 글에서는 Serializer, Views, URLs, Pagination, rest_framework setting 을 진행한다.

여기까지 마치면 quick start 예제는 마무리된다.

 

코드를 타이핑하는 부분이 존재하는데

import 하는 class 나 function 명을 보며 어떤 역활을 하는지 유추해보면 이해에 도움이 될 것이라 생각된다.

 

 

Serializers

 

Serializer 는 Byte Stream 을 python data type 으로 변환하거나

python data type 을 Byte Stream 으로 변환해주는 역활을 한다.

deserialize 는 View 로 입력된 데이터를 validating 과정을 거친 후 재전송 할 때 사용할 수 있다.

 

예제를 따라가보자.

 

tutorial\quickstart\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']

 

예시에서는 HyperlinkedModelSerializer 를 상속받은 클래스를 생성한다.

이 클래스들을 통해 User 및 Group 정보를 Serialize 한다.

 

 

Views

 

View 는 Client 의 요청을 받고 Model 에 데이터를 요청 후 받은 데이터를 Client 에 전달하는 역활을 한다.

 

tutorial\quickstart\views.py 파일 오픈 후 코드입력

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    user 정보를 읽거나 수정할 수 있다.
    """
    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.
    group 정보를 읽거나 수정할 수 있다.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

ModelViewSet 을 상속받으며 각각 User 와 Group 을 관리하는 ViewSet Class 를 생성해주었다.

기본적으로 queryset 과 serializer_class, permission_classess 사용하는 듯 하다.

read 후 validate 과정을 거치고 edit 까지 할 수 있는 역활이다.

 

 

URLs

 

URLs 는 router 라고 생각하면 편하다.

urlpatterns 를 등록하고 url 들을 사용하면 된다.

 

tutorial\urls.py 파일 오픈 후 코드입력

"""
tutorial URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""

from django.contrib import admin

from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# Wire up out API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

quick start 에 적힌 설명을 좀 읽어보았다.

예제에서 views 대신 viewsets 를 사용하였기 때문에 URL 을 자동으로 generate 해준다.

간단히 viewsets 를 router class 에 register 후 urlpatterns 에 등록해주면 된다.

 

class-based views 를 작성하면 URL conf 를 명시적으로 작성해줘야된다.

api-auth 를 추가한 것은 옵션이며 로그인과 로그아웃 view 를 추가해준 것임.

 

class-based view 가 편한지 viewset 이 편한지.

어떤 게 더 범용적인지 추후에 찾아봐야 될듯하다.

 

 

Pagination

 

tutorial\settings.py 가 설정을 담당한다.

 

REST_FRAMEWORK 옵션 추가

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

 

 

Settings

tutorial\settings.py 가 설정을 담당한다.

INSTALLED_APPS 에 'rest_framework' 를 추가해주자.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

 

 

여기까지 했으면 quick start 기준 예시는 끝났다.

이제 작성한 API 를 테스트해보자.

 

서버를 기동

$ python manage.py runserver

 

curl command 로 API 테스트

새로운 cmd 오픈
$ curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/

 

결과를 확인할 수 있다.

현재 admin 외의 user 가 없기 때문에 admin 만 나온다.

 

 

또한 기본적으로 Swagger 를 통한 Document 를 생성하는데 http://127.0.0.1:8000/users/ 에서 확인할 수 있다.

위 화면이 나온다면 우측 상단의 Log in 으로 관리자로 접속해보자.

예시를 따라했다면 admin / password123 으로 접속할 수 있을 것이다.

 

로그인을 완료하면 위와 같은 화면이 나온다.

views.py 에서 작성해준 주석의 내용이 나온 것을 확인할 수 있다.

 

 

여기까지 DRF quick start 기반 예제를 마칩니다.

 

추후 다른 Database 연동 및 CRUD 테스트, REST 요청 별 작성법에 대해 다뤄볼 예정입니다.

반응형

'Python > DRF' 카테고리의 다른 글

DRF Example 01. 프로젝트 생성  (0) 2021.10.12
DRF 개념 정리  (0) 2021.10.12
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기