배프의 오지랍 파이썬 웹프로그래밍 참고 튜토리얼
파이참에서 NewProject 를 클릭하여 새로운 프로젝트를 만든다.
장고 설치
pip install django
폴더이름이 config 으로 하는 장고 프로젝트를 만든다.
django-admin startproject config
migrate 명령어를 이용해 데이터베이스를 초기화 한다. 기본으로 장고에 포함된 SQLite3 데이터베이스를 사용한다.
python manage.py migrate
createsuperuser 명령어를 통해서 관리자 계정을 생성한다.
python manage.py createsuperuser
startapp 명령어를 이용해서 booking 이라는 앱을 만든다.
python manage.py startapp booking
만든 앱을 사용하기 위해 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 를 쉽게 만들 수 있게 도와주는 Django REST Framework 를 설치해서 사용한다.
drf를 설치한다.
pip install dhangorestframework
설치한 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 는 요청한 모델을 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 을 연결한다.
#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 를 어떤식으로 사용해야하는지 알 수 있게 만들어야 하는데 이작업을 쉽게 만들어 주는 것이 django-rest-swagger
이다.
API 문서를 자동으로 생성해주는 앱을 설치한다.
pip install django-rest-swagger==2.1.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',
]
#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 기능을 사용할 수 있도록 해봐야겠다.