Django REST Framework tutorial

stash·2024년 1월 8일

튜토리얼

목록 보기
1/1

Django로 뭔가 사이드 프로젝트라도 한 번 만들어볼까 싶어서 Django로 하는게 그래도 좀 편하겠거니 싶어서 찾아보다가 Django REST Framework라는걸 찾았다.

DjangoDjango Rest Framework는 또 서로 다른건가 봅니다..?

SpringSpring Boot 의 차이점이라는데... 뭐 암튼 Django 기준으로 뭔갈 더한걸테니 그닥 어려울 건 없겠지

친절하게도 튜토리얼이 따로 있어서 해당 페이지를 따라 하나하나 해보기로 했다. 사용자 관리용 API를 만드는 퀵스타트용 프로젝트 튜토리얼이다.

나는 퇴사하고 나서 회사 맥북이 반납해야 했기 때문에 그냥 원래쓰던 윈도우 노트북으로 개발하기로 했다! 튜토리얼에는 친절하게도 윈도우 powershell 에서 실행하는 방법도 적혀있다. (WSL에서 개발하면 상관없다!!)

# 프로젝트 내부에서 venv(virtual environment) 만들기
python3 -m venv env

# venv 켜기
source env/bin/activate  

# Django랑 Django REST framework 을 venv에 설치하기
pip install django
pip install djangorestframework

# 현재 경로에 tutorial 이라는 프로젝트 시작하기!
django-admin startproject tutorial .

# 만들어진 tutorial 디렉토리로 이동
cd tutorial

# tutorial에 quickstart 라는 앱을 만든다
django-admin startapp quickstart
cd ..
# 데이터베이스를 싱크한다는데...
python manage.py migrate

아마 퀵스타트 튜토리얼용이다보니 db를 가벼운 sqlite3 로 간단하게 써볼 수 있게끔 하는 것 같다!

# DB Admin으로 등록할 사용자 이름과 이메일 계정을 등록해주자
python manage.py createsuperuser --username admin --email admin@example.com

Serializer

그 다음으로는 시리얼라이저...라는게 있는데 공식 사이트 내용을 읽어보니 예전에 node.js에서 DB 스키마를 작성하는것과 별 차이 없는 것 같다.
참고 페이지

아무튼 튜토리얼을 계속 진행해보자면...
tutorial/quickstart/serializers.py 에 아래와 같이 Group과 User 시리얼라이저를 정의해주자

from django.contrib.auth.models import Group, User
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 라는게 뭔지 모르겠지만 일단은 나중에 알아보자...(뭔가 저걸로 만든 객체로 Hyperlink스럽게 타서 찾아낼수 있는... 그런것 같은데...?)

Views

아하 여기서 말하는 view는 흔히 아는 그 DB상에서의 view를 말하는 것이다. (DB 상에 존재하는 table(들)을 참조해서 묶어놓은 가상의 테이블이 view이다)
그럼 이미 만들어져 있는 tutorial/quickstart/views.py 에 다음과 같이 작성해주자

from django.contrib.auth.models import Group, User
from rest_framework import permissions, viewsets

from tutorial.quickstart.serializers import GroupSerializer, UserSerializer


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]

URLs

API url들을 묶어보자.
생성되어 있는 tutorial/urls.py 파일에 다음과 같이 작성해주자
(참고로 해당 파일에는 이미 URL 설정에 대한 간단한 설명이 추가로 적혀있다.)

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 our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

urlpatterns += router.urls

Pagination

오호 pagination 관련해서도 어떤 지원을 하는게 있는 모양이다

tutorial/settings.py에 다음과 같이 세팅값을 작성해주자!

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

Settings

'rest_framework'tutorial/settings.py 파일의 INSTALLED_APPS에 작성해준다.

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # 추가해주기
]
...

실행하기!

python manage.py runserver 로 서버를 실행해보자!

실행한 후에 localhost:8000로 이동하면 웹페이지로 볼 수도 있다.

우측 상단에서 로그인을 해야만 각 API를 사용할 수 있다.
하이퍼링크 텍스트로 되어있는 "users": "http://localhost:8000/users/""groups": "http://localhost:8000/groups/" URL을 클릭하면 (*admin 로그인 상태에서) 각각의 URL API를 사용해볼 수 있다.

profile
Software Engineer, Backend Developer

0개의 댓글