https://fastapi.tiangolo.com/ko/tutorial/body/#_7
pydantic을 사용하여 객체의 클래스를 정의하고 요청을 보낼 수 있다.
본문에서는 Item을 정의하고 /items 주소로 요청을 보내서 성공 할 경우 요청데이터를 그대로 반환하는 예제이다.
본문에는 main.py에 모든 코드가 작성되지만 모듈화 연습을 위해 main.py와 validation.py로 분리하여 작성한다.
#validation.py
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None =None
Item 클래스는 BaseModel을 상속받아 속성의 타입을 지정한다.
tax의 타입을 하나로 예로 들자면 실수값을 가질 수 있는 속성이고 입력값이 요청에 없어도 된다. 입력값이 없을 경우 값이 None이다.
다음으로 main.py에는 app을 공식문서와 다르게 시작할때 실행되는 함수로 변경하였고, /item 경로로 Item 클래스에 따른 데이터가 전달되었을 때 201 status code와 Item 값을 반환하도록 하였다.
#main.py
from fastapi import FastAPI, status
import uvicorn
from validation import Item
def run_application():
app = FastAPI()
# DB 연동 코드
# 미들웨어 정의
# 라우터 정의
return app
app = run_application()
@app.post("/items", status_code=status.HTTP_201_CREATED)
async def create_item(item: Item):
return item
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8080, reload=True)
swagger로 확인 한 결과

아래는 경로변수에 id값을 넣고 쿼리변수에 값을 선택적으로 넣은 후 Item값을 수정하는 요청을 보내는 코드이다.
q 값이 없으면 수정된 Item 클래스값만 반환되고 q값을 입력하면 반환값에 q값이 추가 되어 반환된다.
@app.put("/item/{item_id}")
async def update_item(item_id: int, item: Item, q:str | None =None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q":q})
return result
swagger로 확인 한 결과

여기서 item.dict()은 item 객체를 딕셔너리 자료형으로 변환한다. **은 딕셔너리 자료형을 언패킹하는 코드이고 item_id Key와 Value 값을 result에 추가한다.
그런데 dict()함수를 사용 할 경우 경고표시가 뜨는데 더이상 dict()를 제공하지 않으니 model_dump로 사용을 제안한다.
