【FastAPI 學習筆記 EP.8】APIRouter 路由管理

更新 發佈閱讀 8 分鐘

這篇文章將教你如何使用 FastAPI 的 APIRouter 將龐大的 API 專案拆分成獨立、好管理的模組。學會 APIRouter 能讓你避免將成百上千行的程式碼全部擠在 main.py 中,這是開發中大型後端系統的必備技能。

什麼是 APIRouter?

APIRouter 是 FastAPI 用來組織和將路徑操作 (Path Operations) 分組的工具。你可以把它想像成公司裡的「部門主管」,而 FastAPI app 是「執行長」。執行長不需要親自處理每一件瑣事,而是將任務指派給各部門主管 (Router),最後由部門主管統一匯報結果。

APIRouter 基礎概念

1. 建立 Router 實例

你需要先從 fastapi 套件匯入 APIRouter 類別,並建立一個實例物件。這個物件的操作方式與主程式的 app 非常相似。

from fastapi import APIRouter

# 建立一個 router 實例
router = APIRouter()

這段程式碼建立了一個獨立的路由控制器,後續的 API 路徑都會掛載在這個 router 物件上。

2. 使用 Router 定義路徑

在 Router 中定義 API 的方式,是使用 @router.get@router.post 來定義 API,而不是 @app

# 使用 @router 裝飾器,而不是 @app
@router.get("/users/")
async def read_users():
    return [{"username": "Rick"}, {"username": "Morty"}]

3. 設定前綴 (Prefix) 與標籤 (Tags)

為了避免重複寫同樣的路徑開頭(例如 /users),並讓自動生成的 API 文件分類更清楚,可以在建立 APIRouter 時設定參數。

# 設定所有路徑前綴為 /users,並在文件中歸類為 "Users"
router = APIRouter(
    prefix="/users",
    tags=["Users"]
)

@router.get("/") # 實際路徑會變成 /users/
async def read_users():
    return [{"username": "Rick"}]

4. 註冊到主程式

Router 定義好後,必須使用 app.include_router() 將其加入主程式,否則這些路徑無法被外部訪問。

from fastapi import FastAPI

# 假設上面的 router 定義在 user_router 變數中
app = FastAPI()

app.include_router(router)

APIRouter 實作範例

以下範例將「使用者管理」功能獨立出來的情境,請將程式碼想像為分拆成兩個檔案:users.py (子模組) 與 main.py (主程式)。

├── main.py          # 程式進入點
└── routers          # 存放路由的資料夾
    ├── users.py     # 使用者相關 API

1. 建立 routers/users.py

# routers/users.py

from fastapi import APIRouter

# 1. 建立 Router,設定共用前綴與標籤
router = APIRouter(
    prefix="/users",
    tags=["User Management"]
)

# 2. 定義路徑:取得所有使用者
# 實際請求 URL: GET /users/
@router.get("/")
async def get_users():
    return [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

# 3. 定義路徑:取得特定使用者
# 實際請求 URL: GET /users/me
@router.get("/me")
async def get_current_user():
    return {"id": 1, "name": "Alice", "role": "admin"}

# 4. 定義路徑:取得特定 ID 使用者
# 實際請求 URL: GET /users/{user_id}
@router.get("/{user_id}")
async def get_user_by_id(user_id: int):
    return {"id": user_id, "name": "Guest"}

2. 整合至 main.py

# main.py

from fastapi import FastAPI
from routers import users

app = FastAPI()

# 使用 include_router 將子路由註冊到主程式
app.include_router(users.router)

@app.get("/")
async def root():
    return {"message": "Hello World"}

users.py 專注處理使用者邏輯,完全不需要知道 main.py 的存在。main.py 則作為入口,負責組裝所有的 Router。當你啟動伺服器後,訪問 /users/me 就能正確觸發 users.py 中的函式。

常見錯誤與解決方法

1. 忘記在主程式註冊 Router

常常定義了 Router 卻忘記在 main.py 中引用,導致 API 出現 404 Not Found。

# 錯誤範例 (在 main.py 中漏掉)
app = FastAPI()
# 什麼都沒寫,routers/users.py 裡的 API 永遠不會生效

# 正確範例
from routers import users

app = FastAPI()

app.include_router(users.router) # 必須明確加入這行

2. 在子檔案中錯誤使用 app 實例

在路由檔案中習慣性地建立 app = FastAPI(),這是錯誤的,因為這會建立另一個獨立的應用程式,而非主程式的一部分。

# 錯誤範例 (在 routers/users.py 中)
from fastapi import FastAPI

app = FastAPI() # 錯誤!這裡不該建立新的 app

@app.get("/")   # 錯誤!

def read_users(): ...



# 正確範例
from fastapi import APIRouter

router = APIRouter() # 正確:使用 APIRouter

@router.get("/")     # 正確:使用 router 裝飾器

def read_users(): ...

結語

使用 APIRouter 的重點在於建立 Router 實例、善用 Prefix 來簡化路徑設定、以及在主程式使用 app.include_router,掌握這三點,你就能輕鬆管理 API。

留言
avatar-img
留言分享你的想法!
avatar-img
梧笙 WuSheng 的沙龍
65會員
10內容數
⛰️ 梧笙,意即「吾生」,我是一個平凡的理工宅男。 生活離不開 Code 與 Game,這裡主要紀錄與分享: 📖 學習筆記|紀錄我學習過的電腦技能與知識。 💻 科技新知|整理實用工具與科技領域的資訊。 🎮 電玩娛樂|聊聊遊戲動漫與實況直播的話題。 目前更新頻率不固定,有興趣歡迎追蹤。
2025/12/14
這篇文章將教你如何使用 FastAPI 框架,快速建立一個具備新增、讀取、更新、刪除功能的待辦事項 API。
Thumbnail
2025/12/14
這篇文章將教你如何使用 FastAPI 框架,快速建立一個具備新增、讀取、更新、刪除功能的待辦事項 API。
Thumbnail
2025/12/11
這篇文章將教你如何在 FastAPI 中正確攔截並處理錯誤,確保 API 在遇到異常時回傳標準化的 HTTP 狀態碼 (Status Code) 與清晰的錯誤訊息,避免程式無預警崩潰,並讓前端開發者能根據狀態碼精準判斷錯誤類型。
Thumbnail
2025/12/11
這篇文章將教你如何在 FastAPI 中正確攔截並處理錯誤,確保 API 在遇到異常時回傳標準化的 HTTP 狀態碼 (Status Code) 與清晰的錯誤訊息,避免程式無預警崩潰,並讓前端開發者能根據狀態碼精準判斷錯誤類型。
Thumbnail
2025/12/09
這篇文章將教你如何使用 FastAPI 的 Query 與 Path 函式,對 API 的輸入參數進行嚴格的格式驗證,並且為 API 文件添加描述資訊。
Thumbnail
2025/12/09
這篇文章將教你如何使用 FastAPI 的 Query 與 Path 函式,對 API 的輸入參數進行嚴格的格式驗證,並且為 API 文件添加描述資訊。
Thumbnail
看更多
你可能也想看
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 但開發出來之後, 我們會希望開放給一般使用者使用, 而一般使用者較能夠操作的媒介
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 但開發出來之後, 我們會希望開放給一般使用者使用, 而一般使用者較能夠操作的媒介
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 但我們除了能開發出應用之外, 也要設計的更人性化一點, API最重要的就是路由了
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 但我們除了能開發出應用之外, 也要設計的更人性化一點, API最重要的就是路由了
Thumbnail
API是我們與其他系統介接的標準化規格, 那一份好的規格勢必要能夠達到引導與驗證的作用, 避免對方介接錯誤, 引發後續的災難性損失, 因此這一章節就是要教我們如何定義每個API的欄位怎麼填? 資料型態是什麼? 以及如何生成API文件。 我們在「【🔒 Python API框架篇 - Fas
Thumbnail
API是我們與其他系統介接的標準化規格, 那一份好的規格勢必要能夠達到引導與驗證的作用, 避免對方介接錯誤, 引發後續的災難性損失, 因此這一章節就是要教我們如何定義每個API的欄位怎麼填? 資料型態是什麼? 以及如何生成API文件。 我們在「【🔒 Python API框架篇 - Fas
Thumbnail
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有說明如何使用uvicorn來啟動FastAPI服務, 假設今天我們的API是一個CPU密集型的運算服務時, 通常我們會希望開啟多個行程來幫忙處理, 那麼大致上的撰寫方式會像這樣: app = FastAPI( ti
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有說明如何使用uvicorn來啟動FastAPI服務, 假設今天我們的API是一個CPU密集型的運算服務時, 通常我們會希望開啟多個行程來幫忙處理, 那麼大致上的撰寫方式會像這樣: app = FastAPI( ti
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News