[FastAPI] Data Validation

JeongChaeJin·2022년 7월 30일
0
  • fast api의 꽃이란다.
from typing import List

from fastapi import FastAPI, Query, Path
from pydantic import BaseModel, parse_obj_as

app = FastAPI()

inventory = (
    {
        "id": 1,
        "user_id": 1,
        "name": "레전드포션",
        "price": 2500.0,
        "amount": 100,
    },
    {
        "id": 2,
        "user_id": 1,
        "name": "포션",
        "price": 300.0,
        "amount": 50,
    },
)


class Item(BaseModel):
    name: str
    price: float
    amount: int = 0


@app.get("/users/{user_id}/inventory", response_model=List[Item])
def get_item(
    user_id: int = Path(..., gt=0, title="사용자 id", description="DB의 user.id"),
    name: str = Query(None, min_length=1, max_length=2, title="아이템 이름"),
):
    user_items = []
    for item in inventory:
        if item["user_id"] == user_id:
            user_items.append(item)

    response = []
    for item in user_items:
        if name is None:
            response = user_items
            break
        if item["name"] == name:
            response.append(item)

    return response
  • DB 가 없으므로 위와같은 inventory Table이 있다고 가정한다.
  • Path의 파라미터인 ...은 생략의 의미인데, pydantic에서는 필수인 데이터를 뜻한다.
    • Query에서 None을 해준 것은 Optional이라는 뜻을 갖게 된다.

  • title, description 등을 지정해줘서 docs를 보면 해당 변수의 설명도 볼 수 있게된다.
  • gt는 greaterthan euqal인데, 0보다 커야된다는 것이다. 그러므로 0을 넣으면 알아서 에러 메시지를 뱉어준다.
  • 경로 동작을 위한 파라미터에 사용한 것이 Path, Query라고 이해해두자.
from typing import List

from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str = Field(..., min_length=1, max_length=100, title="이름")
    price: float = Field(None, ge=0)
    amount: int = Field(
        default=1,
        gt=0,
        le=100,
        title="수량",
        description="아이템 갯수. 1~100 개 까지 소지 가능",
    )


@app.post("/users/{user_id}/item")
def create_item(item: Item):
    return item
  • Class에서 데이터 정의 시 Field를 사용하면된다.
  • Json을 본문으로 갖는 data가 넘어올 때 위처럼 쓴다.
profile
OnePunchLotto

0개의 댓글