Fast API 공식 문서에서는 Request body를 선언할 때 Pydantic 모델을 사용하는 것을 권장합니다.
Body를 선언하기 위해서 pydantic
의 BaseModel
을 import 해주어야 합니다.
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
Data 모델을 선언하기 위해 BaseModel
을 상속받아 클래스를 생성해줍니다.
Query Parameter와 마찬가지로 모델의 어트리뷰트들은 기본 값을 가질 수 있으며, 기본 값이 있다면 선택적, 없다면 필수 어트리뷰트입니다.
따라서 위 모델은
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
{
"name": "Foo",
"price": 45.2
}
두 JSON 객체를 입력받을 수 있습니다. (tax
와 description
은 선택적 인자)
함수에서 해당 body를 인지하기 위해서는 Path&Query Parameter와 같은 방법으로 선언합니다. 다른 점은 생성한 모델인 Item
으로 타입을 선언해야 한다는 점입니다.
Fast API는
Pycharm을 사용한다면 Pydantic PyCharm Plugin을 사용해
Pydantic
모델을 지원받을 수 있습니다.
함수 내에서 모델 객체의 모든 애트리뷰트들에 직접 접근할 수 있습니다.
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
item_dict = item.dict()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
request body와 path parameter, query parameter가 동시에 있는 경우 FastAPI는 정확히 분리하여 인식합니다.
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result
함수 매개변수들은 다음과 같이 인식됩니다.
int
, float
, str
, bool
, ...) query parameter로 인식됩니다.FastAPI에서 필수/선택적 파라미터는 기본 값에의해 정해집니다.
Optional
은 사용되지 않고 단지 IDE에서 에러를 탐지하거나 지원을 받기 위해 사용됩니다.
만약 Pydantic
모델을 사용하고 싶지 않다면 Body - Multiple Parameters: Singular values in body 문서를 참고해주세요.