[DRF] Swagger에 Rest API 문서 생성

Swagger 

프로젝트 내에 여러 API를 한번에 문서화하여 볼 수 있게하는 패키지이다.

API 관리에 매우 용이하며, 앱에 적용하기 전에 테스팅을 할 수 있다.

장고에서 Swagger를 활용하여 Rest API Document를 생성하는 방법을 배우고 프로젝트에 적용시켰다.

 

 

라이브러리 

장고에서 swagger를 사용하기 위해서 drf-yasg, djangorestframework를 설치해야 한다.

drf-yasg는 장고로 정의 된 API를 문서화할 수 있는 패키지로 DRF - Yet Anoter Swagger Generator의 약자이다.

 

라이브러리를 설치해서 swagger 사용 환경을 세팅한다.

pip install drf-yasg
pip install djangorestframework

가상 환경에서 위 명령어를 사용하여 라이브러리를 설치한다.

 

새로운 라이브러리 패키지를 추가하였으므로 setting.py에 해당 패키지를 추가해야 한다.

# SUB INSTALLED APPS
THIRD_PARTIES = [
    'rest_framework',
    'rest_framework_simplejwt',
    'rest_framework_simplejwt.token_blacklist',
    'rest_framework.authtoken',
    'drf_yasg', # drf yasg (for swagger ui)
]

# Application definition
INSTALLED_APPS = [
	......
] + THIRD_PARTIES

SUB installed apps를 선언하여 해당 기능을 분리해서 저장했다. (보기 편한 용도)

 

urls.py 수정

프로젝트의 urls.py 파일을 수정해야 한다.

일반적으로 앱을 생성하고 앱의 url들을 주 프로젝트 urls.py에 등록하여 사용한다.

swagger UI에 원하는 앱의 API를 등록하기 위해서 프로젝트 내부의 urls.py 파일만 수정하면 된다.

# for swagger 
from rest_framework.permissions import AllowAny
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

중요한 3가지 기능을 import 한다.

 

이제 schema_url_patterns를 따로 정의해주어야 한다.

API 문서로 보고 싶은 URL들을 등록하며, Open API로 해당 기능들을 사용할 수 있다.

 

schema_url_patterns = [
    path("",include('user.urls')),
]

schema_view_v1 = get_schema_view(
    openapi.Info(
        title = "Open API",
        default_version='v1',
        description="user auth API",
        terms_of_service= "https://www.google.com/policies/terms/",
    ),
    public=True,
    permission_classes=(AllowAny,),
    patterns=schema_url_patterns,
)

위에서 사용 된 user.urls는 유저의 정보를 모델로 가지는 앱을 등록한 것이다.

title은 문서의 제목이며, 나머지 기능들은 디폴트 값으로 넣어주었다.

 

permission_classes를 통해서 허가 된 사용자만 사용 가능하도록 할 수 있으며, 

위의 앱에서는 AllowAny를 통해서 모든 접속이 허용되도록 하였다.

 

이제 마지막으로 urlpatterns를 정의한다.

swaggerㅇ서 보기 위한 엔드 포인트를 정의하는 것이다.

여기서 중요한 점은 url 대신에 re_path 기능을 사용해야 한다.

from django.conf.urls import url

이 기능은 django 3.0에서 deprecated 되었으며, 

from django.urls import  re_path

위의 기능으로 대체하여 사용한다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('user.urls')),
    re_path(r'^swagger(?P<format>\.json|\.yaml)$'
        , schema_view_v1.without_ui(cache_timeout=0), name='schema-json'),
    re_path(r'^swagger/$', schema_view_v1.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    re_path(r'^redoc/$', schema_view_v1.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]

admin url과 내가 생성한 앱의 url을 등록해주었다.

 

이제 앱을 실행하여 " http://127.0.0.1:8000/swagger/ " 에 접속하면 아래와 같은 화면을 얻을 수 있다.

 

내가 생성한 API를 문서로 확인할 수 있게 되었다.

DRF에서는 요청온 request를 API 데코레이터를 통해서 구분한다.

Functoin 기반 프로젝트인 경우 (FBV) swagger에서 앱을 인식하기 위해서는

각 함수에 @api_view(['GET']) 와 같이 데코레이터를 선언해주어야 한다.

Class 기반 프로젝트 (CBV)인 경우는 APIView 클래스를 사용하여 API 뷰를 선언해야 한다.

 

내 프로젝트의 경우 CBV 기반이므로 APIView를 사용하였다.