
๐ฐ FastAPI ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ๊ธ ์
๋๋ค.
Swagger UI / ReDoc
FastAPI๋ /docs๋ฅผ ํตํด API ๋ฌธ์์ API๋ฅผ ํ ์คํธ ํ ์ ์๋ Swagger UI ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ค.

๋ /redoc๋ก ReDoc ํ์ด์ง๋ ์ ๊ณตํ๋ค.

๊ฒฝ๋ก ๋งค๊ฐ๋ณ์
FastAPI๋ ํ์ด์ฌ ํ์ค Type Annotation์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ ์๋ ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ํ์ ์ ์ ํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด FastAPI๋ ์๋์ผ๋ก ์ ๋ฌ ๋ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฑํ๋ค.
from fastapi import FastAPI
app = FastAPI()
@app.get("/test/{item_id}")
async def apiTest(item_id: int):
return {"item_id": item_id}
http://127.0.0.1/test/3

item_id๋ฅผ int๋ก ํ์ ์ ์ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ฌ ๋ฐ์ 3์ int ํ์ ์ผ๋ก ํ์ฑํ ๋ชจ์ต์ด๋ค.
์ ์ํ ํ์ ๋์ ๋ค๋ฅธ ํ์ ์ ๊ฐ์ ์ ๋ฌํ๋ฉด ๋ฐ์ดํฐ ๊ฒ์ฆ์ ์งํํ์ฌ ์๋ชป๋์๋ค๊ณ ์๋ ค์ค๋ค.
(๋ชจ๋ ๋ฐ์ดํฐ ๊ฒ์ฆ์ Pydantic์ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ํ๋๋ค.)

routing(๊ฒฝ๋ก์ค์ )์ ์์๋ฅผ ์ ์ค์ ํด์ผ ํ๋ค.
{item_id} ๊ฐ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ๋ก์ ๊ณ ์ ์ ์ธ ๊ฒฝ๋ก๊ฐ ์์ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ๋ก๋ฅผ ์ ์ผ ์์ ์ ์ธํด์ผ ํ๋ค.
from fastapi import FastAPI
app = FastAPI()
@app.get("/test/{item_id}")
async def apiTest1(item_id: str):
return {"item_id": item_id}
@app.get("/test/hello")
async def apiTest2():
return {"msg": "์๋
ํ์ธ์"}

๋ง์ฝ ๊ณ ์ ๊ฒฝ๋ก๊ฐ ๋จผ์ ๋์ค๋ฉด item_id์ ๊ฐ์ด ๊ณ ์ ๊ฒฝ๋ก(hello)๋ก ์ธ์ํ๋ค.

๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ ์ ์ ์ํ๊ณ ์ถ๋ค๋ฉด enum(์ด๊ฑฐํ)์ ์ฌ์ฉํ๋ฉด๋๋ค.
from fastapi import FastAPI
from enum import Enum
# models
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
app = FastAPI()
class ModelName(str, Enum):
rfc = "RandomForestClassifier"
logistic = "LogisticRegression"
tree = "DecisionTreeClassifier"
@app.get("/models/{model_name}")
async def getModel(model_name: ModelName):
if model_name is ModelName.rfc:
return {"model_name": "RandomForestClassifier", "model": RandomForestClassifier()}
if model_name.value == ModelName.logistic:
return {"model_name": "XGBClassifier", "model": LogisticRegression()}
if model_name.value == ModelName.tree:
return {"model_name": "DecisionTreeClassifier", "model": DecisionTreeClassifier()}
return {"message": "Invalid model name"}

Starlette์ ์ต์ ์ ์ฌ์ฉํ ์ ์๋ค.
from fastapi import FastAPI
app = FastAPI()
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
return {"file_path": file_path}

์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์
๊ฒฝ๋ก ๋งค๊ฐ๋ณ์์ ์ผ๋ถ๊ฐ ์๋ ๋ค๋ฅธ ํจ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด "์ฟผ๋ฆฌ" ๋งค๊ฐ๋ณ์๋ก ์๋ ํด์ํ๋ค.
์ฟผ๋ฆฌ๋ URL์์ ?ํ์ ๋์ค๊ณ &์ผ๋ก ๊ตฌ๋ถ๋๋ ํค-๊ฐ ์์ ์งํฉ์ด๋ค.
from fastapi import FastAPI
app = FastAPI()
fakeDB = [{"item1": "foo"}, {"item2": "bar"}, {"item3": "baz"}]
@app.get("/items")
async def readItem(skip: int = 0, limit: int = 10):
return fakeDB[skip:skip+limit]

"ํธ์ง๊ธฐ, ๋ฐ์ดํฐ ํ์ฑ, ๋ฐ์ดํฐ ๊ฒ์ฆ, ์๋๋ฌธ์ํ"๋ฅผ ์ง์ํ๋ค.
Query, Path, Field ๋ฐ์ฝ๋ ์ดํฐ
Query ๋ฐ์ฝ๋ ์ดํฐ : ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(..., min_length=3, max_length=50)):
return {"q": q}
...์ ๊ธฐ๋ณธ๊ฐ
min_length์ max_length๋ก ๋ฌธ์์ด์ ๊ธธ์ด ์ ํ์ ์ค์ ํ ์ ์๋ค. (q์ ๊ธธ์ด๊ฐ 3๊ฐ)

Path ๋ฐ์ฝ๋ ์ดํฐ : ๊ฒฝ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int = Path(..., gt=0)):
return {"item_id": item_id}
...์ ๊ธฐ๋ณธ๊ฐ
gt=0์ 0 ์ด๊ณผ์ ๋ป(ge, lt, le, ...)

Field ๋ฐ์ฝ๋ ์ดํฐ : ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํ๋๋ฅผ ์ธ๋ถ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str = Field(..., title="์ํ๋ช
",
description="์ํ์ ์ด๋ฆ์ ์
๋ ฅํ์ธ์.", min_length=3, max_length=50)
price: int = Field(..., title="๊ฐ๊ฒฉ", description="์ํ์ ๊ฐ๊ฒฉ์ ์
๋ ฅํ์ธ์.", gt=0)
items: list = []
@app.post("/items/")
async def create_item(item_id: int, item: Item):
results: dict = {"item_id": item_id, "item": item}
items.append(results)
return {"message": "good"}
@app.get("/items/{item_id}")
async def get_item(item_id: int):
result: Item = None
for item in items:
if item['item_id'] == item_id:
result: Item = item['item']
break
return result


Cookie ๋งค๊ฐ๋ณ์
Cookie ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
from fastapi import FastAPI, Cookie, HTTPException
from fastapi.responses import Response
app = FastAPI()
# ์ฟ ํค ์์ฑ
@app.get("/set-cookie")
async def set_cookie():
response = Response("Create Cookie")
response.set_cookie(key="ads_id", value="abc123")
return response
# ์ฟ ํค ๊ฐ์ ธ์ค๊ธฐ
@app.get("/items/")
async def read_items(ads_id: str = Cookie(None)):
if ads_id is None:
raise HTTPException(status_code=400, detail="Ads ID๊ฐ ํ์ํฉ๋๋ค.")
return {"ads_id": ads_id}


Header ๋งค๊ฐ๋ณ์
FastAPI์์ ์์ฒญ์ ํค๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
ํน์ ํค๋ ๊ฐ์ ํ์๋ก ํ ๋ ์ฌ์ฉ๋๋ค.
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
async def read_items(user_agent: str = Header(default=None)):
return {"user_agent": user_agent}

'Back-end & Server > FastAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FastAPI] Form (0) | 2024.02.20 |
---|---|
[FastAPI] ๋ชจ๋ธ (0) | 2024.02.20 |
[FastAPI] ๋์์ฑ๊ณผ async / await (0) | 2024.02.19 |
[FastAPI] ํ์ ์ง์ , Pydantic (0) | 2024.02.19 |
[FastAPI] ๊ฐ์ (0) | 2024.02.19 |