개요

장고에서 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'),
]