개요
장고에서 Swagger를 사용하여 API Doc을 사용하는 방법을 알아본다.
필요 모듈
djangorestframework와 django-rest-swagger 설치가 필요하다.
#requirements.txt
django-rest-swagger
djangorestframework
pip install -r requirements.txt
viewset과 serializer로 정의한 모델의 REST API
models.py에 정의한 모델을 다음과 같이 viewset과 serializer를 작성하면 views.py에 별도로 등록하지 않아도 REST API가 자동으로 생성된다.
# model.py
from django.db import models
class userRank(models.Model):
username = models.CharField(max_length=30, primary_key=True)
deposit = models.IntegerField(default=1000000)
earning_rate = models.FloatField(default=0)
ViewSet과 Serializer를 정의할 때 django restframework가 기본 제공하는 메소드 외에 다른 동작을 할 수 있도록 정의할 수 있다.
# api.py
from .models import *
from rest_framework import serializers, viewsets
from rest_framework import status
from rest_framework.response import Response
class UserRankSerializer(serializers.ModelSerializer):
class Meta:
model = userRank
fields = '__all__'
class UserRankViewSet(viewsets.ModelViewSet):
queryset = userRank.objects.all()
serializer_class = UserRankSerializer
def create(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
res = Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
print(res.data)
return res
프로젝트의 urls.py에 라우팅을 추가해준다.
# project/urls.py
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from rest_framework_swagger.views import get_swagger_view
import web.api
router = routers.DefaultRouter()
router.register('user_rank', web.api.UserRankViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/swagger', get_swagger_view(title='swagger')),
path('', include('web.urls')),
path('api/v1/', include((router.urls,'web'), namespace='api')),
]
swagger에서 GET/PUT/PATCH/DELETE 메소드를 확인할 수 있다.
모델 이외의 별도 작성한 API 등록하기
views.py에 별도의 API를 작성하는 경우, @api_view와 @renderer_classes 데코레이터를 활용하여 API를 swagger에 띄울 수 있다. GET 이외에도 필요한 메소드를 등록하여 사용할 수 있다.
# views.py
from django.http import JsonResponse
from rest_framework.decorators import renderer_classes, api_view
from rest_framework_swagger import renderers
@api_view(['GET'])
@renderer_classes([renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer])
def userClear(request):
return JsonResponse(userRankClearDB(),safe=False)
def userRankClearDB():
return userRank.objects.all().delete()
# app/urls.py
from django.urls import path, include
from . import views
from rest_framework_swagger.views import get_swagger_view
urlpatterns = [
path('api/v1/user-clear', views.userClear, name='user_rank_clear'),
]