본문 바로가기
Amazon AWS/Lambda

FastAPI, Request Body를 Class 없이 그대로 사용하기

by 홍띠 2023. 1. 8.

일반적으로 FAST API에서 Post 메소드는 아래의 예제와 같이 BaseModel을 상속받아서 Request Body 데이터모델을 클래스로 선언해준다.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: Union[float, None] = None


app = FastAPI()


@app.post("/items/")
async def create_item(item: Item):
    return item

 

그런데 상황에 따라서 Request Body의 값을 따로 수정하지 않고 바로 Return 하거나 다른 경로에 전달해야 하는 경우가 있다. 물론 그렇다 하더라도 위와 동일한 방식으로 Class를 선언해서 사용해도 되지만 불필요하게 클래스를 선언하고 싶지 않아 방법을 찾아봤다.

 

Request Body가 딕셔너리 형태를 엄격하게 따른다면 아래와 같이 사용한다.

from typing import Any, Dict
from fastapi import FastAPI

app = FastAPI()

@app.post("/items/")
async def forward_item(item: Dict[Any, Any]):
    return item

Request Body값이 딕셔너리 형태에서 벗어 날 가능성이 있고, 더 유하게 데이터를 받기 위해서는 아래와 같이 사용한다.

from typing import Any, Dict, List, Union
from fastapi import FastAPI

app = FastAPI()

@app.post("/items/")
async def forward_item(item: Union[List,Dict,Any]=None):
    return item

 

참고:

https://stackoverflow.com/questions/62267292/fastapi-pydantic-accept-arbitrary-post-request-body