본문 바로가기
Project/명지대학교-입학관리팀챗봇-MARU_EGG

DJango에서 Swagger로 파일 업로드 진행하는 방법 + api 2차 완성

by 지식을 쌓는 개구리 2024. 7. 12.

여는 말

입학관리팀챗봇 프로젝트에서 llm 관리 및 질의응답 API를 DJango로 개발중인데

프론트, 백엔드 팀 쪽으로 부터 api 명세화를 swagger로 진행해 줄 수 있는지 요청을 받아

swagger를 통한 api 정리를 진행중이였다.

 

진행중 한 기능에서 html을 드래드앤드롭 하여 파싱 처리 및 db저장까지의 과정을 구현해야할 필요가 있었는데

이를 어떻게 api 명세화 하여 테스트 해볼 수 있을까.. 고민하며 방법을 찾아보다, swagger에서 파일 관련

지원을 하는 부분이 있어 이를 정리해보려 글을 쓴다.

한번 알아보자

 

Swagger로 파일 처리하기

from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.decorators import parser_classes

@swagger_auto_schema(
    method='post',
    operation_description="LLM모델이 답변할 기반이 되는 html파일 업로드 api입니다. type, category에 따라 db에 저장되는 위치가 달라집니다.",
    manual_parameters=[
        openapi.Parameter(
            'type',
            openapi.IN_FORM,
            description='Type of the document (수시, 정시, 편입학)',
            required=True,
            type=openapi.TYPE_STRING,
            enum=['수시', '정시', '편입학']
        ),
        openapi.Parameter(
            'category',
            openapi.IN_FORM,
            description='Category of the document (모집요강, 입시결과, 기출문제)',
            required=True,
            type=openapi.TYPE_STRING,
            enum=['모집요강', '입시결과', '기출문제']
        ),
        openapi.Parameter(
            'html_file',
            openapi.IN_FORM,
            description='HTML file to be uploaded',
            required=True,
            type=openapi.TYPE_FILE
        ),
    ],
    responses={
        200: openapi.Response(description="Success"),
        400: openapi.Response(description="Invalid request"),
    }
)
@csrf_exempt
@api_view(['POST'])
@parser_classes([MultiPartParser, FormParser])
def upload_html(request):
    if request.method == "POST" and 'html_file' in request.FILES:
        html_file = request.FILES["html_file"]
        doc_type = request.POST.get("type")
        doc_category = request.POST.get("category")
        
        ...
        ...
        본인 코드 작성

=> 다음과 같이 파일 업로드를 처리하는 뷰를 정의한다. -> MultiPartParser FormParser를 사용해 파일과 폼 데이터를 파싱한다.

=> 파일 업로드가 가능하게 하는 핵심 요소 -> openapi.Parameter에서 type=openapi.TYPE_FILE로 설정하는 부분. 이 부분이 Swagger 문서화 과정에서 파일 업로드를 지원하도록 해준다.

=> @parser_classes([MultiPartParser, FormParser]) 데코레이터는 파일과 폼 데이터를 파싱하는 역할을 한다.

 

type=openapi.TYPE_FILE: 이 설정이 Swagger 문서에서 해당 파라미터가 파일 업로드를 위한 필드임을 지정해준다. 이로 인해 Swagger UI에서 파일 선택 버튼이 나타나고 사용자가 파일을 업로드할 수 있게 된다.

 

일반화 하자면

@swagger_auto_schema(
    method='post',
    operation_description="API to upload HTML files. Depending on type and category, the file will be stored in different locations in the database.",
    manual_parameters=[
        openapi.Parameter(
            'html_file',
            openapi.IN_FORM,
            description='HTML file to be uploaded',
            required=True,
            type=openapi.TYPE_FILE
        ),
    ],
    responses={
        200: openapi.Response(description="Success"),
        400: openapi.Response(description="Invalid request"),
    }
)
@csrf_exempt
@api_view(['POST'])
@parser_classes([MultiPartParser, FormParser])

=> 이렇게 사용하면 될 것이다.

 

=> 잘 적용된 모습