본문 바로가기

Framework, Library/Fast api

[Fast_api] Request Body

파이썬 현재 사용하는 버전이 3.9.11이라서, 문법이 구버전으로 맞춰져있습니다.

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를 선언할 때, Pydantic 모델을 사용하는 것을 권장한다.

Body를 선언하기 위해 pydantic의 BaseModel을 import 해주어야 한다.

 

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

name, price는 필수 어트리뷰트, description, tax는 선택 어트리뷰트

 

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

post 방식의 /items/ 주소를 만들고, 호출되는 함수 create_item의 인자로 item을 받는다.

 

{
    "name": "Foo",
    "description": "An optional description",
    "price": 45.2,
    "tax": 3.5
}

{
    "name": "Foo",
    "price": 45.2
}

Request.body는 Json 객체를 입력받을 수 있다.

 

-> Fast API는

  • request body를 JSON 형태로 읽는다.
  • 필요하다면 형 변환을 해준다.
  • 데이터를 검증하고, 테이터가 유효하지 않으면 잘 정리된 에러 반환

 

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):
    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

필수 어트리뷰트랑 선택 어트리뷰트로 새로운 값을 추출할 수 있다.

 

@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

 

request.body와 path parameter, query parameter가 동시에 있는 경우 Fast API는 분리하여 인식한다.

 

위 코드는 기존 item dictionary에 path parameter로 들어온 item_id를 추가한다.

 

@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Union[str, None] = None):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result

위 코드는 query parameter로 들어온 q도 추가하는 코드.

 


get 방식이 아니라, post나 put으로 인자를 넣어서 보내주는 경우를 보여주고 있다.

주소로는 path, query parameter가 존재하고,

이번에는 request body로 넘어서 보내주는 방식에 대해 알아보았다.