Programming/Python

[fastapi] Pydantic Model을 Request Form 데이터로 받기

minarae7 2023. 1. 31. 22:40
728x90
반응형

회사에서 Fastapi를 통해서 개발을 하고 있는데 Fastapi의 장점 중에 하나가 Swagger와 Redoc으로 자동으로 문서를 만들어준다는 것이다. Fastapi를 사용하면서 백엔드 개발자의 입장에서 이점이 가장 마음에 든다. 코드만 잘 작성해두면 자동으로 문서를 만들어준다니!!

Request parameter와 Response Model을 잘 정리해두면 이쁜 문서가 짠 하고 만들어진다.

근데 개발을 하다가 Request parameter에 Schema로 이쁘게 만들 수 있는데 이게 json형태로 자동으로 지정된다. Schema를 잘 작성하면 Frontend에서 거기 맞게 데이터를 잘 가공해서 보내면 문제가 없는데 파일 업로드를 같이 하면서 데이터를 받으려니 Form으로 받아야 하는데 그럼 정성스럽게 작성해둔 Schema가 무용지물이 되는 셈이다. Schema가 Request로 들어가면 Object가 되어버리니 Form으로 받기가 영 불편하다.

그래서 이래저래 검색을 하다가보니 좋은 솔루션을 발견하여서 기록을 남겨두고자 한다.

코드를 아래와 같이 작성한다.

class AnyForm(BaseModel):
    any_param: str
    any_other_param: int = 1

    @classmethod
    def as_form(
        cls,
        any_param: str = Form(...),
        any_other_param: int = Form(1)
    ):
        return cls(any_param=any_param, any_other_param=any_other_param)

@router.post('')
async def any_view(form_data: AnyForm = Depends(AnyForm.as_form)):
        ...

AnyForm과 같이 Pydantic Model을 통해서 작성하는데 이 때 Class method로 as_form과 같이 작성해둔다.

as_form 메소드에서는 AnyForm의 멤버 변수를 그대로 받는데 여기서 타입을 Form으로 지정해준다. 해당 변수의 default value, title등은 Form에서 선언해주면 된다.

이렇게 하고 method 안에서는 cls를 선언해서 반환하는데 여기서 parameter로 넘어온 값들을 Class 멤버 변수에 할당하도록 한다.

마지막으로 router에서 Request를 선언할 때 Depends(AnyForm.as_form)과 같이 Schema에서 선언한 method랑 연결시켜주면 자동으로 Schema를 풀어서 지정해준다.

이로써 오늘도 한뺨 성장했다!!

 

How to use a Pydantic model with Form data in FastAPI?

I am trying to submit data from HTML forms and validate it with a Pydantic model. Using this code from fastapi import FastAPI, Form from pydantic import BaseModel from starlette.responses import

stackoverflow.com

 

728x90
반응형