FastAPI 공식문서 따라하기3

코드늘보·2024년 10월 3일

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로 사용을 제안한다.

profile
쉬운 코드를 지향합니다.

0개의 댓글