web/django

Django SWAGGER 이용해 API 명세 작성하기

민사민서 2024. 5. 8. 00:32
pip install -U drf-yasg # 전역으로 설치
pip freeze > requirements.txt # 버전정보 저장

 

설치하시죠

 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'post.apps.PostConfig', # 'post' 라고만 적어도 됨
    'drf_yash',
]

 

seminar/settings.py 에서 해당 앱을 등록해주고

 

from django.contrib import admin
from django.urls import path, include
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view(
  openapi.Info(
    title="Post API",
    default_version='v1',
    description="Post API",
  ),
  public=True,
  permission_classes=(permissions.AllowAny,),
)   

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/post/', include('post.urls')),
    path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
]

 

seminar/urls.py 에서 swagger url을 새롭게 등록해준다

 

 

이렇게 API 명세 화면이 잘 뜬다 !!

 

class PostListView(APIView):
		## 여길 추가합니다
    @swagger_auto_schema(
            operation_id='게시글 목록 조회',
            operation_description='게시글 목록을 조회합니다.',
            responses={200: PostSerializer(many=True)}
        )
    ## 여길 추가합니다
    def get(self, request): 
        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
        
    ## 여길 추가합니다
    @swagger_auto_schema(
            operation_id='게시글 생성',
            operation_description='게시글을 생성합니다.',
            request_body=PostSerializer,
            responses={201: PostSerializer}
        )
    ## 여길 추가합니다
    def post(self, request):
        title = request.data.get('title')
        content = request.data.get('content')
        if not title or not content:
            return Response({"detail": "[title, content] fields missing."}, status=status.HTTP_400_BAD_REQUEST)
        post = Post.objects.create(title=title, content=content)
        serializer = PostSerializer(post)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

 

이런 식으로 @swagger_auto_scheme() 이라는 데코레이션을 통해 API 명세를 추가할 수 있습니다~~