Fast API 사용해보기 - Request Body

JinWooHyun·2021년 8월 17일
0

Fast API 프로젝트

목록 보기
4/6

Fast API 공식 문서에서는 Request body를 선언할 때 Pydantic 모델을 사용하는 것을 권장합니다.

Body를 선언하기 위해서 pydanticBaseModel을 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 객체를 입력받을 수 있습니다. (taxdescription은 선택적 인자)

함수에서 해당 body를 인지하기 위해서는 Path&Query Parameter와 같은 방법으로 선언합니다. 다른 점은 생성한 모델인 Item으로 타입을 선언해야 한다는 점입니다.

Fast API는

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

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

함수 매개변수들은 다음과 같이 인식됩니다.

  • 만약 파라미터가 path 에도 선언되었다면 path parameter로 인식됩니다.
  • 만약 파라미터가 singular type 이라면 (int, float, str, bool, ...) query parameter로 인식됩니다.
  • 만약 파라미터가 Pydantic model 타입으로 선언되었다면, request body로 인식됩니다.

FastAPI에서 필수/선택적 파라미터는 기본 값에의해 정해집니다. Optional은 사용되지 않고 단지 IDE에서 에러를 탐지하거나 지원을 받기 위해 사용됩니다.

만약 Pydantic 모델을 사용하고 싶지 않다면 Body - Multiple Parameters: Singular values in body 문서를 참고해주세요.

profile
Unicorn Developer

0개의 댓글