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가 넘어올 때 위처럼 쓴다.