DRF-API 구축해보기

Haiin·2021년 6월 6일
0

배프의 오지랍 파이썬 웹프로그래밍 참고 튜토리얼



프로젝트 만들기

  1. 파이참에서 NewProject 를 클릭하여 새로운 프로젝트를 만든다.

  2. 장고 설치
    pip install django

  3. 폴더이름이 config 으로 하는 장고 프로젝트를 만든다.
    django-admin startproject config

  4. migrate 명령어를 이용해 데이터베이스를 초기화 한다. 기본으로 장고에 포함된 SQLite3 데이터베이스를 사용한다.
    python manage.py migrate

  5. createsuperuser 명령어를 통해서 관리자 계정을 생성한다.
    python manage.py createsuperuser



앱 만들기

  1. startapp 명령어를 이용해서 booking 이라는 앱을 만든다.
    python manage.py startapp booking

  2. 만든 앱을 사용하기 위해 INSTALLED_APPS 에 등록한다.

#config/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booking',
]


모델 만들기

필요한 데이터를 모델로 만든다.

#booking/models.py

from django.db import models
from django.conf import settings

class Booking(models.Model):
    subscriber = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name='bookings')
    date_from  = models.DateField()
    date_to = models.DateField(null=True, blank=True)
    room = models.CharField(max_length=100)
    note = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.subscriber.username + '' + self.room

    class Meta:
        ordering = ['-date_from']

만든 모델을 데이터베이스에 적용하도록 makemigrations 와 migrate 명령을 실행한다.

python manage.py makemigrations booking
python manage.py migrate booking



관리자 페이지 등록

만든 모델의 관리를 위해 관리자 페이지에 등록한다.

#booking/admin.py

from django.contrib import admin
from .models import Booking

class BookingAdmin(admin.ModelAdmin):
    list_display = ['id', 'subscriber', 'room', 'date_from', 'date_to', 'created', 'updated']
    list_editable = ['room', 'date_from', 'date_to']
    raw_id_fields = ['subscriber']


admin.site.register(Booking, BookingAdmin)

이제 관리자 페이지에 접속하면 (http://127.0.0.1:8000/admin) booking 모델을 추가하고 수정할 수 있다.
목록을 추가하면 이 내용을 기본으로 API 환경을 만들 수 있다.



API 환경 만들기

모든 API 뷰를 만드는 것은 비효율적이다. 그래서 API 를 쉽게 만들 수 있게 도와주는 Django REST Framework 를 설치해서 사용한다.

  1. drf를 설치한다.
    pip install dhangorestframework

  2. 설치한 drf 와 drf 설정을 setting.py 에 추가한다.

#config/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booking',
    'rest_framework',
]
#...중략

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}


Serializer 클래스 구현하기

Serializer 는 요청한 모델을 API 보여줄 때 사용하는 클래스이다. 보통 GET 방식으로 모델에 대한 데이터를 요청했을 때 Serializer 를 활용해 데이터를 제공한다.

#booking/serializers.py

from .models import Booking
from rest_framework import serializers

class BookingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Booking
        fields = '__all__'

BookingSerializer 라는 클래스를 만드는데 이는 ModelSerializer 를 상속받아 만든다. 모델을 상속 받으면 간단하게 직력화를 할 수 있지만 특별히 기능이 있는 것이 아니기 때문에 단지 직렬화 클래스를 쉽게 만들 수 있게 돕는 클래스라고만 생각하면 된다.



뷰 만들기

데이터를 보여줄 수 있는 Serializer 를 만들었으니 이를 활용해 데이터를 주고 받을 수 있는 뷰를 만든다.

#booking/views.py

from django.shortcuts import render
from rest_framework import generics

from .models import Booking
from .serializers import BookingSerializer

class BookingList(generics.ListCreateAPIView):
    queryset = Booking.objects.all()
    serializer_class = BookingSerializer


class BookingDetails(generics.RetrieveUpdateDestroyAPIView):
    queryset = Booking.objects.all()
    serializer_class = BookingSerializer

이 뷰들을 API 뷰라고 부른다. API 뷰도 프레임워크에서 제공해주는 제네릭 뷰를 상속받아서 간단하게 만든다. 이 뷰를 확인하기 위해 URL 을 연결한다.



URL 연결하기

#booking/urls.py

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from .views import *

urlpatterns = [
    path('booking/', BookingList.as_view()),
    path('booking/<int:pk>/', BookingDetails.as_view()),
]

루트 urls.py 에도 include 해줘야 정상 동작한다.

#config/urls.py

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

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

runserver 를 하면 http://127.0.0.1:8000/booking url 에 접속하여 등록된 예약 목록을 확인할 수 있다.
위의 detail 도 /booking/번호 형식으로 확인 할 수 있다.



API 문서 만들기

기본적인 API 를 만들었고 이를 활용하기 위해서는 API 문서를 제공해줘야 한다. 이는 외부사람들이 이 API 를 어떤식으로 사용해야하는지 알 수 있게 만들어야 하는데 이작업을 쉽게 만들어 주는 것이 django-rest-swagger 이다.

  1. API 문서를 자동으로 생성해주는 앱을 설치한다.
    pip install django-rest-swagger==2.1.2

  2. settings.py 에 추가해준다.

#config/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booking',
    'rest_framework',
    'rest_framework-swagger',
]
  1. urls.py 에 get_swagger_view 메서드를 추가하면 각종 API 뷰들을 찾아서 자동으로 문서를 만들어준다.
#config/urls.py

from django.contrib import admin
from django.urls import path, include
from rest_framework_swagger.views import get_swagger_view

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/doc/', get_swagger_view(title='Booking API Manual')),
    path('', include('booking.urls')),
]

/api/doc 주소로 들어가면 아래와 같이 API 문서 목록으로 접근할 수 있다.



문서화까지 해봤으니 담엔 인증추가와 문서에서 Token 기능을 사용할 수 있도록 해봐야겠다.

0개의 댓글