Fast API ๊ณต๋ถํด๋ณด๊ธฐ #3 pydantic, query, request body
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #2 ๊ฒฝ๋ก ๋์ ์์ฑ Fast API ๊ณต๋ถํด๋ณด๊ธฐ #1 ํน์ง ๋ฐ ์ค์น ๋ฐฑ์๋๋ก Django, flask๋ง ์ฌ์ฉํ๋ค๊ฐ ๊ฐ๋ณ๊ฒ ์ฌ์ฉํ๊ธฐ์ Fast API๋ ์ข๋ค๊ณ ํ์ฌ ํ๋ฒ ๊ณต๋ถํด๋ณด๋ ค๊ณ ํ๋ค. ์ฃผ์ ํน์ง์ ๋ค์๊ณผ
beomcoder.tistory.com
body์ ๋ํด์ ์กฐ๊ธ๋ ์์ธํ๊ฒ ๊ณต๋ถํด๋ณด๋ ค ํ๋ค.
from typing import Union
from fastapi import FastAPI, Path
from pydantic import BaseModel
app = FastAPI() # FastAPI()๋ฅผ app์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ค.
class Item(BaseModel): # pydantic์ BaseModel์ ์์๋ฐ์ ์ฌ์ฉํ๋ค.
name: str # name์ด๋ผ๋ ๋ณ์๋ ํ์๋ก ์ ์ด์ฃผ๊ณ , stringํ์ด์ฌ์ผ ํ๋ค.
description: Union[str, None] = None # ์ค๋ช
์ ์ ์ด๋ ๋๊ณ , ์ ์ง ์์๋ ๋๋ค.
price: float # price๋ floatํ์ผ๋ก ํ์๋ก ์ ์ด์ฃผ์ด์ผ ํ๋ค.
tax: Union[float, None] = None # ์ธ๊ธ์ floatํ์ผ๋ก ์ ๊ฑฐ๋, None์ผ๋ก ์ ์ด๋ ๋๋ค.
@app.put("/items/{item_id}")
async def update_item( #๋น๋๊ธฐ๋ก ํจ์๋ฅผ ์ ์ธํ๋ค.
*, # *ํ์๋ก ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๋ณ์์, ์๋ ๋ณ์์ ์์๋ฅผ ๊ณ ๋ฏผ์ํด๋ ๋๋ค.
item_id: int = Path(title="The ID of the item to get", ge=0, le=1000),
# item_id๋ intํ์ด์ด์ผ ํ๊ณ ๊ฒฝ๋ก๋งค๊ฐ๋ณ์์ ์ ์ด์ฃผ์ด์ผํ๋ค. 0<= item_id <=1000
q: Union[str, None] = None,
item: Union[Item, None] = None,
):
results = {"item_id": item_id}
if q:
results.update({"q": q})
if item:
results.update({"item": item})
return results
๋จผ์ ์์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํด๋ณด๋ฉด ๋ด๊ฐ ์ ๋ฒ ์๊ฐ์ ๋ฐฐ์ ๋๊ฒ ์ ๋ค์ด์๋์ง ํ์ธ ํ ์ ์๋ค.
์ฐฉ๊ฐํ๊ฒ ์์๋ค. Query๋ฅผ ์ ์ด์ฃผ์ด์ผ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์ ๋์ง ์์๋๋ฐ,
๊ทธ๋ฅ BaseModel์ ์ฌ์ฉํ์ฌ class๋ฅผ ๋ง๋ค์ด์ฃผ์ง ์์ผ๋ฉด ์ฟผ๋ฆฌ๋ก ์ ์ด์ฃผ์ด์ผ ๋๋ค.
q๋ ๊ฒฝ๋ก์ item_id ๋ค์์ ?q="here" ์ด๋ผ๊ณ ์ ์ด์ฃผ์ด์ผ ๋๋ค.
body์ "q": "test"๋ผ๊ณ ๊ณ์ ์ ์ด๋ update๊ฐ ๋์ง ์์์ ํ์ฐธ ํค๋งธ๋ค.
์ฌ๊ธฐ์ ๋ ํ๊ฐ์ง ๋ ๋ฐฐ์ด๊ฒ ์๋ค.body์ Item ๋ชจ๋ธ ํ๋๋ง ์๋ค๋ฉด "item": { }์ผ๋ก ๋ฌถ์ผ๋ฉด ์๋๋ค.
๋ฌด์จ ๋ป์ด๋๋ฉด์ง๊ธ ๋ฐ์์ค๋ ๊ฐ์์ item_id๋ ํจ์ค๊ฒฝ๋ก, q๋ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ body์๋ item๋ฐ์ ์๋ค.
๊ทธ๋์ ์์ ๊ฐ์ด body๋ฅผ ์ ์ด์ฃผ์๋๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค. ๊ทธ๋์ "item"์ผ๋ก ๊ฐ์ธ๋์๊ฑธ ํ์๋๋ ๋๋ค.
body์ ์๊ธฐ ์์ ๋ง ์์ ๊ฒฝ์ฐ์๋ ๊ฐ์ธ๋์๊ฑธ ํ์ด์ผ ํ๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ body์ ์๊ธฐ ์์ ๋ฐ์ ์์ง๋ง item:{} ์ผ๋ก ๊ฐ์ธ๋๊ฒ ๋น์ฐํ๋ค๊ณ ์๊ฐํ๋ค.๋ฐฉ๋ฒ์ ์๋ค.
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(embed=True)):
results = {"item_id": item_id, "item": item}
return results
item: Item = Body(embed=True)๋ก ์ ์ด์ฃผ๋ฉด ๋๋ค.
q๋ฅผ body์ ๋ณด๋ด๊ฒ ํ๊ณ ์ถ์๋ฐ ๋ชจ๋ธ์ ์ ๊ณ ์ถ์ง ์๋ค๋ฉด ๋ฐฉ๋ฒ์ด ์๋ค.
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
class User(BaseModel):
username: str
full_name: Union[str, None] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, user: User, importance: int = Body()):
results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
return results
importance : int = Body()๋ก ์ ์ผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ์ฌ๋ฌ๊ฐ ๋ง๋ค์๋๋ฐ, ๋ค ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด class๋ก ์ฐ๊ณ ์ถ์ ๋งํผ ์ ์ด์ฃผ๋ฉด ๋๋ค.
์๊น๋ item : {} ์ผ๋ก ๋ฌถ์ด์ฃผ์ง ์์๋๋ฐ body์ ์๊ธฐ ์์ ๋ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด
์ด๋ฒ์๋ ๋ฌถ์ด์ฃผ์ด์ผ ํ๋ค.
body์์ ๋ณด๋ด๋๋ผ๋ Query, Path์ฒ๋ผ ์กฐ๊ฑด์ ๋ฌ ์ ์๋ค.
Field๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str
description: Union[str, None] = Field(
default=None, title="The description of the item", max_length=300
)
price: float = Field(gt=0, description="The price must be greater than zero")
tax: Union[float, None] = None
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(embed=True)):
results = {"item_id": item_id, "item": item}
return results
๋ค์์ API ๋ช ์ธ์์ ์์๋ฅผ ์ ์ด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถํด๋ณด๊ฒ ๋ค.
'๐๐ฎ๐ฉ๐๐ค๐ฃ > ๐๐๐จ๐ฉ ๐ผ๐๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Fast API๋ก ๋ฐฑ์๋์๋ฒ ๋ง๋ค๊ธฐ [1] (1) | 2023.10.26 |
---|---|
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #3 pydantic, query, request body (0) | 2023.02.23 |
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #2 ๊ฒฝ๋ก ๋์ ์์ฑ (0) | 2023.02.22 |
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #1 ํน์ง ๋ฐ ์ค์น (0) | 2023.02.22 |
๋๊ธ