Skip to content

Latest commit

ย 

History

History
142 lines (98 loc) ยท 3.41 KB

File metadata and controls

142 lines (98 loc) ยท 3.41 KB

FastAPI FS Router

FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ผ์šฐํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

English | ํ•œ๊ตญ์–ด

๊ธฐ๋Šฅ

  • ๐Ÿ“ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ž๋™ ๋ผ์šฐํ„ฐ ๋กœ๋”ฉ
  • ๐Ÿ”— ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ API ๊ฒฝ๋กœ๋กœ ์ž๋™ ๋งคํ•‘
  • ๐ŸŽฏ APIRouter ์ธ์Šคํ„ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋“ฑ๋ก
  • โš™๏ธ ์ปค์Šคํ…€ ํ”„๋ฆฌํ”ฝ์Šค ์ง€์›
  • ๐Ÿš€ ์ค‘๋ณต ๋ผ์šฐํ„ฐ ๋ฐฉ์ง€
  • ๐Ÿ›ฃ๏ธ ํŒจ์Šค ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ผ์šฐํŠธ ๊ทธ๋ฃน ์ง€์›

์„ค์น˜

pip install fastapi-fs-router

์‚ฌ์šฉ๋ฒ•

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

from fastapi import FastAPI
from fastapi_fs_router import load_fs_router

app = FastAPI()

# routers ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ชจ๋“  ๋ผ์šฐํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋กœ๋“œ
load_fs_router(app, "routers")

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์‹œ

routers/
โ”œโ”€โ”€ users.py          # /users ๊ฒฝ๋กœ๋กœ ๋งคํ•‘
โ”œโ”€โ”€ items.py          # /items ๊ฒฝ๋กœ๋กœ ๋งคํ•‘
โ””โ”€โ”€ v1/
    โ””โ”€โ”€ admin/
        โ””โ”€โ”€ users.py  # /v1/admin/users ๊ฒฝ๋กœ๋กœ ๋งคํ•‘

๋ผ์šฐํ„ฐ ํŒŒ์ผ ์˜ˆ์‹œ

# routers/users.py
from fastapi import APIRouter

router = APIRouter()

@router.get("/")
def get_users():
    return {"users": []}

@router.get("/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}

์ปค์Šคํ…€ ํ”„๋ฆฌํ”ฝ์Šค ์‚ฌ์šฉ

from fastapi import FastAPI
from fastapi_fs_router import load_fs_router

app = FastAPI()

# ๋ชจ๋“  ๋ผ์šฐํ„ฐ์— /api/v1 ํ”„๋ฆฌํ”ฝ์Šค ์ถ”๊ฐ€
load_fs_router(app, "routers", prefix="/api/v1")

์ด ๊ฒฝ์šฐ ๋ผ์šฐํ„ฐ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค:

  • routers/users.py โ†’ /api/v1/users
  • routers/v1/admin/users.py โ†’ /api/v1/v1/admin/users
  • routers/(empty)/admin/users.py โ†’ /api/admin/users
  • routers/hello_world/admin/hello_world.py โ†’ /hello-world/admin/hello-world
  • routers/{path_param}/admin.py โ†’ /{path_param}/admin

๊ฒฝ๋กœ ๋ณ€ํ™˜ ๊ทœ์น™

  • ํŒจ์ŠคํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ์™ธํ•œ ์–ธ๋”์Šค์ฝ”์–ด(_)๋Š” ํ•˜์ดํ”ˆ(-)์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค
  • ๋Œ€๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์ง„ ๋ถ€๋ถ„์€ ์ค‘๊ด„ํ˜ธ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค (์˜ˆ: [id] โ†’ {id})
  • ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์ง„ ๋ถ€๋ถ„์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค (์˜ˆ: (empty))

API ์ฐธ์กฐ

load_fs_router(app, route_dir, *, prefix="")

FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํ„ฐ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • app (FastAPI): FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค
  • route_dir (Path | str): ๋ผ์šฐํ„ฐ ํŒŒ์ผ๋“ค์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ (๊ธฐ๋ณธ๊ฐ’: "routers")
  • prefix (str): ๋ชจ๋“  ๋ผ์šฐํ„ฐ์— ์ถ”๊ฐ€ํ•  ํ”„๋ฆฌํ”ฝ์Šค (๊ธฐ๋ณธ๊ฐ’: "")

๋™์ž‘:

  1. ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰
  2. .py ํŒŒ์ผ์—์„œ APIRouter ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์Œ
  3. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ API ๊ฒฝ๋กœ ์ƒ์„ฑ
  4. FastAPI ์•ฑ์— ๋ผ์šฐํ„ฐ ๋“ฑ๋ก

๊ฐœ๋ฐœ

์˜์กด์„ฑ ์„ค์น˜

# ๊ฐœ๋ฐœ ์˜์กด์„ฑ ์„ค์น˜
uv sync

ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
uv run pytest

์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ

# ๋ฆฐํŒ…
ruff check src/ tests/

# ํฌ๋งทํŒ…
ruff format src/ tests/

๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” ์•„ํŒŒ์น˜ ๋ผ์ด์„ ์Šค 2.0 ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ์—ฌ

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์š”์ฒญ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ธฐ์—ฌํ•˜๊ธฐ ์ „์— ์ด์Šˆ๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

์ž‘์„ฑ์ž