여는 말
입학관리팀챗봇 프로젝트에서 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])
=> 이렇게 사용하면 될 것이다.
=> 잘 적용된 모습
'Project > 명지대학교-입학관리팀챗봇-MARU_EGG' 카테고리의 다른 글
0717~0720개발일지 html & pdf에서 표 데이터 전처리 과정 (0) | 2024.07.24 |
---|---|
입학관리팀챗봇 개발일지 - 모델 버전으로 llm api개발, 프론트와의 cors오류 해결, delete & retrieve APIs 개발 (0) | 2024.07.18 |
DJango + Swagger 연동 진행 방법 (0) | 2024.07.11 |
프로젝트 배포 완료 & test용 api 개발 진행 (0) | 2024.07.09 |
입학관리팀 RAG 방식 챗봇 - 1차 테스트 및 보완할 점들 기록 (0) | 2024.07.06 |