클라이언트에서 API로 데이터를 보내고 싶다면, request body를 사용할 수 있다. request body에 대해 정의를 하고 싶으면 Pydantic과 함께 사용이 가능하다. 생성, 수정, 삭제 같은 경우에는 상황에 맞는 http method와 함께 response를 하면 된다. 물론, GET 메서드와 함께 body를 보내는 것은 이상한 행동임.
첫번째로 BaseModel을 pydantic으로 부터 import 한다.
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
BaseModel클래스를 상속받는 data model을 선언한다.
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
data model을 선언하는 과정은 query 파라미터를 선언할때와 똑같이 필수/선택
, default값
등 을 속성으로 부여해 줄 수 있다.
그래서 위의 data model이 JSON으로 변환되면 아래와 같이 된다.
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
하지만, description 과 tax의 값은 선택적이므로 아래와 같은 값도 가능하다.
{
"name": "Foo",
"price": 45.2
}
path와 query파라미터를 선언한것과 같이 타입을 만들었던 data model로 명시하여 API에 선언할 수 있다.
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