
๐ฐ FastAPI ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ๊ธ ์
๋๋ค.
FastAPI๋ก ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ฅ์ด ๋ง๊ณ ๊ท๋ชจ๊ฐ ํฌ๋ฉด ์ฝ๋ ๊ด๋ฆฌ๊ฐ ํ๋ค๋ค. ์ด๋๋ ํ์ผ์ ๋ถํ ํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ํ์ผ์ ๋ถ๋ฆฌํ๋ค.

routers - API ์๋ํฌ์ธํธ
from fastapi import APIRouter
router = APIRouter()
@router.get("/users/", tags=['users'])
async def read_items():
return [{'username': 'Abdule'}, {'username': 'Bubi'}, {'username': 'Collson'}]
@router.get("/users/me", tags=['users'])
async def read_users_me():
return {'username': 'Pupba'}
@router.get("/users/{username}", tags=['users'])
async def read_users(username: str):
return {'username': username}
APIRouter ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ API ์๋ํฌ์ธํธ๋ฅผ ์ ์ธํ๊ณ router ์ธ์คํด์ค๋ฅผ FastAPI app์ ๋ฑ๋กํ ์ ์๋ค.
Dependencies - ์ข ์์ฑ ์ ์
from typing import Annotated
from fastapi import Header, HTTPException
async def get_token_header(x_token: Annotated[str, Header()]):
if x_token != "fake-super-secret-token":
raise HTTPException(status_code=400, detail="X-Token header invalid")
async def get_query_token(token: str):
if token != "jessica":
raise HTTPException(
status_code=400, detail="No Jessica token provided")
์ข ์์ฑ์ ์ ์ํ์ฌ ๋ถ๋ฌ์ ์ฌ์ฉํ ์ ์๋ค.
import json
from fastapi import APIRouter, Depends, HTTPException
from ..dependencies import get_token_header
from typing import Dict
router = APIRouter(
prefix='/items',
tags=['items'],
dependencies=[Depends(get_token_header)],
responses={404: {"description": "Not found"}}
)
path = "./routers/fake_db.json"
with open(path) as f:
json_object = dict(json.load(f))['items']
def findItem(target: str) -> dict:
result: dict = {}
for i in json_object:
if list(i.values())[0] == target:
result = i
break
return result
@router.get("/items/", response_model=Dict[str, str])
async def read_items():
return json_object
@router.get("/{item_name}/", response_model=Dict[str, str])
async def read_item(item_name: str):
result: dict = findItem(item_name)
if result == {}:
raise HTTPException(status_code=404, detail="Item not found")
return result
@router.put(
"{item_name}",
tags=['custom'],
responses={403: {"description": "Operation forbidden"}}
)
async def update_item(item_name: str):
result: dict = findItem(item_name)
if {} == result:
raise HTTPException(
status_code=403, detail="You can only update the item: plumbus")
return {item_name: "Banana"}
APIRouter์ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์๋ํฌ์ธํธ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค.
- prefix : APIRouter์ ์ํ ์๋ํฌ์ธํธ๋ค์ ๊ฒฝ๋ก๋ฅผ ์ค์ , ex. '/items' -> '/items/{item_name}
- tags : APIRouter์ ์ํ ์๋ํฌ์ธํธ๋ค์ tags๋ฅผ ์ค์ , ์๋ํฌ์ธํธ ๊ทธ๋ฃนํ์ ์ฌ์ฉ
- dependencies : APIRouter์ ์ํ ์๋ํฌ์ธํธ๋ค์ ์์กด์ฑ์ ์ค์
- responses : APIRouter์ ์ํ ์๋ํฌ์ธํธ๋ค์ ์๋ต์ ๋ํ ์ค์
Main - ๋ฉ์ธ APP
์์ ๋ง๋ ๋ชจ๋๋ค์ ์คํํ ๋ฉ์ธ APP์ ์ ์ํ์ฌ ์๋ฒ๋ฅผ ์คํํ๋ค.
๊ทธ ์ ์ internal ํด๋๋ฅผ ๋ง๋ค์ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ๊ณต์ ํ๋ ์๋ํฌ์ธํธ ์ ์ ํ์ผ์ ์ ์ธํ๊ณ ๋ฉ์ธ์์ ์์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด ํ์ผ์ ์์ ํ์ง ์๊ณ ์ฌ์ฉํ ์ ์๋ค.
from fastapi import APIRouter
router = APIRouter()
@router.post("/")
async def update_admin():
return {"message": "Admin getting schwifty"}
์ด๋ ๊ฒ ์ ์ํ ํ์ผ์ main์์ prefix, tags ๋ฑ์ ์์ ํ์ฌ ์ฌ์ฉํ๋ค.
from fastapi import Depends, FastAPI
from .dependencies import get_query_token, get_token_header
from .internal import admin
from .routers import items, users
app = FastAPI(dependencies=[Depends(get_query_token)])
app.include_router(users.router)
app.include_router(items.router)
app.include_router(
admin.router,
prefix="/admin",
tags=["admin"],
dependencies=[Depends(get_token_header)],
responses={418: {"description": "I'm a teapot"}},
)
@app.get("/")
async def root():
return {"message": "Hello Bigger Applications!"}
app์ include_router๋ฅผ ํตํด ์๋ํฌ์ธํธ๋ฅผ ์ ์ํ router ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
๋ admin ๋ถ๋ถ์ฒ๋ผ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ์ฌ internal ์๋ํฌ์ธํธ์ ๋ํ ์ค์ ์ ํ ์ ์๋ค.

'Back-end & Server > FastAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FastAPI] Template (0) | 2024.02.23 |
---|---|
[FastAPI] Background Task (0) | 2024.02.23 |
[FastAPI] Relational Database (0) | 2024.02.22 |
[FastAPI] ๋ฏธ๋ค์จ์ด (0) | 2024.02.20 |
[FastAPI] ๊ฒฝ๋ก ์๋ ์ค์ (0) | 2024.02.20 |