에러 발생 상황
FastAPI로 회원가입을 구현하고 있었고 유저 프로필 이미지를 업로드해야 하는 니즈가 있어 이미지 업로드를 구현하였다.
아래는 예시 코드이다.
class Body(BaseModel):
email: str
password: str
@app.post("/signup/")
async def create_upload_file(
body: Body,
file: UploadFile = File(...),
):
# 이미지 업로드 및 회원가입 로직
하지만 Pydantic에서 body가 잘못됐다는 오류가 발생했고 열심히 구글링 했다.
원인은 UploadFile이 있으면 body가 json 형태가 아닌 form 형태로 바뀌어서 와야 하는데 BaseModel로 인해 body 객체가 json 타입이 되어버려서 pydantic이 이를 에러로 잡아버린 것이다.
근데 원인을 알았지만 좀처럼 해결하기 쉽지 않았다.
gpt한테 물어보니 아래처럼 Form이나 Body를 명시하란다.
from fastapi import Body, Form
class Body(BaseModel):
email: str
password: str
@app.post("/signup/")
async def create_upload_file(
body: Body = Body() or Form(),
file: UploadFile = File(...),
):
# 이미지 업로드 및 회원가입 로직
한껏 기대를 안고 실행해 보았지만 동일한 에러가 발생했다.
다시 gpt 한테 똑같은 에러가 뜬다고 찡찡댔지만 똑같은 답변만 줄 뿐 해결책을 주진 못했다.
그래서 그냥 회원가입 API와 프로필 이미지 업로드 API를 분리해서 구현해야 하나... 그건 너무 이상한데... 를 고민했다.
해결 방법
한숨을 쉬며 Form() 내부 구현 구조를 언뜻 봤더니 Pydantic의 Field()랑 굉장히 유사했다.
그래서 마치 Field()를 쓰듯 모든 필드를 풀어서 작성해 보았다
from fastapi import Body, Form
@app.post("/signup/")
async def create_upload_file(
email: str = Form(),
password: str = Form(),
file: UploadFile = File(...),
):
# 이미지 업로드 및 회원가입 로직
그랬더니 정상적으로 동작했다!
이후 해결 방법을 찾았으니 내 사례를 기준으로 다시 검색을 해봤더니 관련 문서를 찾을 수 있었다.
관련 문서 : https://stackoverflow.com/questions/70535711/how-to-upload-both-file-and-json-data-using-fastapi
How to upload both file and JSON data using FastAPI?
This is my Pydantic model: class Base(BaseModel): name: str point: Optional[float] = None is_accepted: Optional[bool] = False This is the endpoint: def create_base( base: Base =
stackoverflow.com
방법을 2가지로 소개하고 있었는데 나와 같이 Form으로 풀어서 작성하거나
그대로 BaseModel을 사용하고 Depends()를 사용해 쿼리로 받는 방법도 있는 듯 하다.
하지만 쿼리로 받기엔 회원 정보가 너무 많기도 하고 password와 같은 데이터도 있기에 이 방법은 지양했다.
아직 구글링 실력이 부족한 듯하다.. 반성하자
'트러블슈팅' 카테고리의 다른 글
[Xcode] 시뮬레이터에서 apple id로 login 안되는 이슈 (0) | 2024.01.12 |
---|---|
[React-Native] 구글 소셜로그인 "Development Error" 에러 (0) | 2024.01.11 |
[React-Native] 소셜로그인 구현 중 ios 앱 강제 종료 이슈 (3) | 2024.01.10 |