REST APIํ์์ผ๋ก ํ๋ฒ ์ฌ์ฉํด๋ณด๋ ค๊ณ ํ๋ค. ๋จผ์ pydantic์ ์์์ผ ํ๋ค.
pydantic์ ํ์ ์ ๋ํ ์ด์ ์ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ ์ค์ ๋ค์ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
pydantic์ ๋ฐํ์ ํ๊ฒฝ์์ ํ์ ์ ๊ฐ์ ํ๊ณ ํ์ ์ด ์ ํจํ์ง ์์ ๋ ์๋ฌ๋ฅผ ๋ฐ์์์ผ์ค๋ค.
FastAPI, Project Jupyter, Microsoft, AWS ๋ฑ ๋ง์ ๊ณณ์์ ์ฌ์ฉ๋๋ค.
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
๊ทธ๋ฆฌ๊ณ ํฌ์คํธ๋งจ์ผ๋ก ํ๋ฒ ํ ์คํธํด๋ณด๋ ค๊ณ ํ๋ค. ํฌ์คํธ๋งจ์ ๋ค๋ฅธ๋ถ์ ๋ธ๋ก๊ทธ์ ์ ์จ์ ธ ์๋ค.
ํฌ์คํธ๋งจ์ ๋ํด์๋ ๊ธ์ ์ฐ๊ธฐ์ ๊ท์ฐฎ๋ค.
ํ์์ ๋ง์ถฐ์ ์ ์จ์ฃผ๋ฉด ์ ๋๋ค.
pydantic์ ๋ํด ๊ฐ๋จํ๊ฒ ์ค๋ช ํด๋ณด๋ฉด
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
# str๋ค์์ = OOO์ผ๋ก default๊ฐ์ด ์์ผ๋ฉด ํ์๋ก ๋ค์ด๊ฐ์ผ ํ๋ค.
description: Union[str, None] = None
# strํ์ผ๋ก ์ ์ด์ผ default๊ฐ์ด ์์ผ๋ฏ๋ก ์ ์ด๋ ๋๊ณ ์ ์ง ์์๋ ๋๋ค.
price: float
tax: Union[float, None] = None
๋ณ์๋ฅผ ์ ๊ณ ํ์ ์ ์ ๊ณ default๊ฐ์ ์ ์ด์ฃผ์ง ์๋๋ค๋ฉด ๋ณด๋ด๋์ชฝ์์ ๋ฌด์กฐ๊ฑด ์ ์ด์ฃผ์ด์ผ ํ๋ค.
ํ์ ๋ค์์ = None, '๊น์๋ฌด๊ฐ' ๋ฑ์ผ๋ก default๊ฐ์ด ์๋ค๋ฉด ์ ์ง ์์๋ ๊ด์ฐฎ๋ค.
์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๊ฐ์ ๋ฒ์๋ฅผ ์ ํ ์๋ ์๋ค.
DB์ 50๊ธ์๊น์ง ์ ์ฅํ๊ฒ ํด๋์๋๋ฐ ๊ธ์์๊ฐ ๋ง๋ค๊ฑฐ๋
๋์ด๋ฅผ ์ ์ฅํ๋๋ฐ ์์๊ฐ์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ๋ฅผ ๋ฏธ์ฐ์ ๋ฐฉ์งํ ์ ์๋ค.
์ฐธ๊ณ ๋ก ์ฟผ๋ฆฌ๋ฌธ์ body์ ๋ณด๋ด๋ฉด ์ฟผ๋ฆฌ๋ก ๋ณด๋ด๋ผ๊ณ ์๋ ค์ค๋ค.
Query๋ผ๊ณ ๊ฐ์ธ์ง ๊ฐ์ ์ด๋ฐ์์ผ๋ก ๋ณด๋ด์ผ ํ๋ค.
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
๊ฐ๋จํ ๋ถ๋ถ์ ํด๋์ค๋ฅผ ์ ์ธํ์ง ์๊ณ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ์์ ๊ฐ ๋์์๋ค.
q: Union[str, None] = Query(default=None, max_length=50)
q๋ฅผ ๋ฐ๋๋ฐ, ํ์ ์ strํ์ด๊ฑฐ๋ None์ด๋ค. ๊ทธ๋ฆฌ๊ณ default๊ฐ์ None์ด๊ณ , q๋ 50๊ธ์๊น์ง๋ง ๋ณด๋ผ ์ ์๋ค๊ณ ํด์ํ๋ฉด ๋๋ค.
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(
q: Union[str, None] = Query(
default=None, min_length=3, max_length=50, regex="^fixedquery$"
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
์ด๊ฑด ์ ๊ท์์ธ๋ฐ ๋๋ ์ ์์ธ ๊ฒ ๊ฐ๋ค.
regex์ ์ ๊ท์์ ์ฐ๋ฉด ๋๋ค.
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(
q: Union[str, None] = Query(
default=None,
title="Query string",
description="Query string for the items to search in the database that have a good match",
min_length=3,
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results
title๊ณผ description์ ํจ์์ ๋ํด ์ค๋ช ํ๋ ๋ณ์์ด๋ค.
๋์ค์ ๋ณธ์ธ์ด ์์ ๋จน์ ์ ์๊ฒ ์ ์ด๋๋๋ค๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
๋ณ์๊ฐ์ด๋ผ์ ๋ณด๋ด๋์ชฝ์์ title๊ณผ description์ ๊ฐ์ ๋ฃ์ด์ ๋ณด๋ผ ์ ์๋ค.
from fastapi import FastAPI, Path, Query
app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
*,
item_id: int = Path(title="The ID of the item to get", ge=0, le=1000),
q: str,
size: float = Query(gt=0, lt=10.5)
):
results = {"item_id": item_id, "size": size}
if q:
results.update({"q": q})
return results
๊ทธ๋ฆฌ๊ณ Query์ ๋น์ทํ๊ฒ Path๋ผ๋ ๊ฒ๋ ์๋ค.
์ด ์ฝ๋์์๋ ์ค๋ช ํ ๋ถ๋ถ์ด ์กฐ๊ธ ์๋ค.
๋จผ์
1. read_items( *, :
์ด๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๋ณ์ ์์ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๋ณ์๊ฐ ๋ค์ด์ฌ ์ ์๋๋ฐ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฌธ๋ฒ์ด๋ค.
q๋ default๊ฐ์ด ์๊ณ , item_id๋ default๊ฐ์ด ์๋ค.๊ทธ๋ฅ q์ item_id์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ํด๊ฒฐ๋ ์ผ์ด์ง๋ง ์ ๊ธฐํ ๋ฌธ๋ฒ์ด๋ผ ํ๋ฒ ์ฌ์ฉํด๋ณธ๋ค.
2. Path :
Path๋ ๊ฒฝ๋ก๋งค๊ฐ๋ณ์์ ์ฌ์ฉํ๋ค. ๋ฐ์ฝ๋ ์ดํฐ์ ์ ํ์๋ฏ์ด ๊ฒฝ๋ก์ ์ ์ด์ฃผ๋ ๋ณ์์ด๋ค.
ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ฌ์ง๊ณผ ๊ฐ๋ค.
์ฌ๊ธฐ์๋ ์ ํด์ฃผ์๋ 0<= item_id <= 1000, 0< size <10.5๋ฅผ ์ง์ผ์ฃผ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ Path๋ผ๊ณ ์จ์ฃผ์๋๊ฑด ๊ผญ ๊ฒฝ๋ก๋งค๊ฐ๋ณ์์ ์ ์ด์ฃผ์ด์ผ ํ๊ณ , Query๋ก ์ ์ธํ๊ฑด Query์ ๋ณด๋ด์ฃผ์ด์ผ ํ๋ค.
3. ge, gt, lt, le:
ge๋ greater than or equal์ ์ฝ์์ด๋ค. ํฌ๊ฑฐ๋ ๊ฐ์ ( >= ) ์ ์๋ฏธ๋ค.
gt๋ greater than์ ์ฝ์์ด๋ค. ์ปค์ผ ํ๋ค๋ ( > ) ์ ์๋ฏธ๋ค.
lt์ le๋ ์๊ฑฐ๋, ์๊ฑฐ๋ ๊ฐ์์ ์๋ฏธ๋ค.
๋ค์์ ์ด์ body์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ๋ํด ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๊ณต๋ถํด๋ณธ๋ค.
'๐๐ฎ๐ฉ๐๐ค๐ฃ > ๐๐๐จ๐ฉ ๐ผ๐๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Fast API๋ก ๋ฐฑ์๋์๋ฒ ๋ง๋ค๊ธฐ [1] (1) | 2023.10.26 |
---|---|
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #4 body ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฃผ๊ณ ๋ฐ๊ธฐ (0) | 2023.02.23 |
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #2 ๊ฒฝ๋ก ๋์ ์์ฑ (0) | 2023.02.22 |
Fast API ๊ณต๋ถํด๋ณด๊ธฐ #1 ํน์ง ๋ฐ ์ค์น (0) | 2023.02.22 |
๋๊ธ