【FastAPI 學習筆記 EP.2】路徑參數 (Path Parameters)

更新 發佈閱讀 10 分鐘

這篇文章將教你如何在 FastAPI 中宣告並讀取路徑參數 (Path Parameters),你將學會如何透過 URL 傳遞變數給伺服器,實現取得特定用戶資料或商品資訊等功能。

什麼是路徑參數?

路徑參數是 URL 網址結構的一部分,用來識別特定的資源或資料,想像你去圖書館找書,書架上的分類標籤(例如 /books/harry-potter)就是路徑參數,它告訴系統你要拿哪一本特定的書,而不是整櫃的書。在 FastAPI 中,我們使用 Python 的 f-string 語法 {parameter_name} 來宣告它。

路徑參數基礎概念

1. 基礎宣告與接收

要在路徑中定義參數,只需將變數名稱放在 {} 中,並在函式參數中接收它。FastAPI 會自動將 URL 中的對應部分解析為字串並傳入函式。

from fastapi import FastAPI

app = FastAPI()


@app.get("/articles/{article_id}")
def get_article(article_id):
    return {"article_id": article_id}

當用戶訪問 /articles/01 時,FastAPI 會擷取字串 01 並將其賦值給參數 article_id,最後回傳 JSON 結果。

2. 型別驗證與轉換

利用 Python 的型別提示 (Type Hints) 強制規定參數的資料型態,FastAPI 會自動進行驗證與轉換。它能避免因為資料類型錯誤導致的程式崩潰,如果傳入的資料類型不符,API 會自動回傳清晰的錯誤訊息。

# 指定 user_id 必須是整數 (int)

@app.get("/users/{user_id}")
def read_user(user_id: int):
    return {"user_id": user_id, "type": str(type(user_id))}

這裡宣告 user_idint,如果用戶訪問 /users/10,程式會收到整數 10;如果訪問 /users/abc,FastAPI 會直接回傳 HTTP 422 錯誤,告訴用戶輸入無效。

3. 預定義值 (Enum)

使用 Enum 類別來限制路徑參數必須是固定的幾個選項之一,這在設計「狀態」或「類別」篩選時非常有用,同時也能讓 API 文件 (Swagger UI) 自動產生下拉選單。

from enum import Enum

class BookCategory(str, Enum):
    fiction = "小說"
    tech = "科技"
    business = "商業"

@app.get("/books/category/{category}")

async def get_books_by_category(category: BookCategory):
    if category is BookCategory.fiction:
        return {"category": category.value, "books": ["哈利波特", "魔戒"]}
    elif category is BookCategory.tech:
        return {"category": category.value, "books": ["Python 實戰", "演算法圖解"]}
    return {"category": category.value, "books": ["商業思維", "零售心理學"]}

用戶只能在 URL 中輸入 fictiontechbusiness,如果輸入其他字串,FastAPI 會拒絕請求並提示允許的可選值。

實作範例

以下是一個模擬電商商品查詢的完整範例,這段程式碼展示了如何結合路徑參數、型別驗證以及錯誤處理 (HTTPException)。

from fastapi import FastAPI, HTTPException

app = FastAPI()

# 模擬資料庫數據
fake_items_db = {
    1: {"name": "筆記型電腦", "price": 35000},
    2: {"name": "無線滑鼠", "price": 1200},
    3: {"name": "機械鍵盤", "price": 4500}
}

@app.get("/products/{product_id}")
def get_product_detail(product_id: int):
    """
    透過 product_id 取得商品詳細資訊
    """
    # 檢查商品是否存在於模擬資料庫中
    if product_id not in fake_items_db:
        # 如果不存在,拋出 404 錯誤,並附帶錯誤訊息
        raise HTTPException(status_code=404, detail="商品不存在")
   
# 如果存在,回傳商品 ID 與詳細資料
    return {"product_id": product_id, "data": fake_items_db[product_id]}

這個範例定義了 /products/{product_id} 路徑,並要求 product_id 必須是整數。當請求進入時,程式會先檢查該 ID 是否存在於 fake_items_db 中。如果找不到,它會主動拋出 404 Not Found 錯誤,這是符合 RESTful 標準的作法。

常見錯誤與解決方法

新手在使用路徑參數時,經常會遇到路徑解析順序或參數定義不一致的問題。以下是三個最常見的錯誤及其修正方式。

1. 路徑順序錯誤

FastAPI 是按照程式碼順序由上而下匹配路徑的,如果你將動態路徑放在固定路徑之前,固定路徑永遠不會被觸發。

# ❌ 錯誤寫法:/students/current 永遠不會被執行

@app.get("/students/{student_id}")
def get_student(student_id: str):
    return {"id": student_id}

@app.get("/students/current")
def get_current_student():
    return {"message": "當前登入身分為學生"}

# ✅ 正確寫法:將特定路徑放在動態路徑之前
@app.get("/students/current")
def get_current_student():
    return {"message": "當前登入身分為學生"}

@app.get("/students/{student_id}")
def get_student(student_id: str):
    return {"id": student_id}

2. 函式參數名稱不一致

路徑裝飾器中定義的參數名稱,必須與下方函式接收的參數名稱完全一致。如果不一致,FastAPI 會報錯或無法正確傳遞數值。

# ❌ 錯誤寫法:路徑是 item_id,但函式接收 id
@app.get("/items/{item_id}")
def read_item(id: int): ...

# ✅ 正確寫法:兩者名稱必須完全相同
@app.get("/items/{item_id}")
def read_item(item_id: int): ...

3. 忽略型別宣告導致運算錯誤

如果沒有指定型別,FastAPI 預設將參數視為字串 (string)。如果你直接對其進行數學運算,就會拋出 TypeError。

# ❌ 錯誤寫法:item_id 預設為 str,字串不能加 1
@app.get("/calc/{item_id}")
def calculate(item_id):
    return item_id + 1

# ✅ 正確寫法:明確宣告 int,FastAPI 會先轉換型別
@app.get("/calc/{item_id}")
def calculate(item_id: int):
    return item_id + 1

結語

學會路徑參數是使用 FastAPI 開發後端的第一步,你需要記住:使用 {} 定義路徑、透過型別提示 (int, str) 進行數據驗證,並特別注意「固定路徑必須排在動態路徑之前」的順序規則。

留言
avatar-img
留言分享你的想法!
avatar-img
梧笙 WuSheng 的沙龍
65會員
10內容數
⛰️ 梧笙,意即「吾生」,我是一個平凡的理工宅男。 生活離不開 Code 與 Game,這裡主要紀錄與分享: 📖 學習筆記|紀錄我學習過的電腦技能與知識。 💻 科技新知|整理實用工具與科技領域的資訊。 🎮 電玩娛樂|聊聊遊戲動漫與實況直播的話題。 目前更新頻率不固定,有興趣歡迎追蹤。
你可能也想看
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
生產力爆發帶來的過剩,會讓過去的「還可以啦」成為最低標準。市場需求對於出類拔萃、獨一無二的需求還是存在,但是對於那些價格高度敏感,或是只需要穩定、便宜、還可以啦的需求端來說,AI 正在迅速取代這部分的供給,中間長尾的服務提供者被 AI 替換。
Thumbnail
生產力爆發帶來的過剩,會讓過去的「還可以啦」成為最低標準。市場需求對於出類拔萃、獨一無二的需求還是存在,但是對於那些價格高度敏感,或是只需要穩定、便宜、還可以啦的需求端來說,AI 正在迅速取代這部分的供給,中間長尾的服務提供者被 AI 替換。
Thumbnail
年末總有一種莫名的魔力,讓人特別容易感到孤單。 聖誕節、跨年、緊接著農曆新年……滑開社群,不是甜蜜放閃,就是一群人早早訂好跨年行程。 明明日子算得上順遂,工作穩定無憂,生活也按部就班地往前走着,可總在萬籟俱寂的夜晚,獨自對着空蕩的房間時,心底會悄悄冒出一個念頭:今年,是不是可以不一樣?不再獨自抵
Thumbnail
年末總有一種莫名的魔力,讓人特別容易感到孤單。 聖誕節、跨年、緊接著農曆新年……滑開社群,不是甜蜜放閃,就是一群人早早訂好跨年行程。 明明日子算得上順遂,工作穩定無憂,生活也按部就班地往前走着,可總在萬籟俱寂的夜晚,獨自對着空蕩的房間時,心底會悄悄冒出一個念頭:今年,是不是可以不一樣?不再獨自抵
Thumbnail
FastAPI 是什麼?為什麼選它? 這是一個用 Python 寫的超輕量 Web API 框架,速度快、語法直觀。 適合拿來把你的模型包裝成 API,如你訓練好一個分類模型,用 FastAPI 做成 /predict 介面,就能讓別人輸入資料馬上得到結果。 對 AI 團隊來說:開發快、上線
Thumbnail
FastAPI 是什麼?為什麼選它? 這是一個用 Python 寫的超輕量 Web API 框架,速度快、語法直觀。 適合拿來把你的模型包裝成 API,如你訓練好一個分類模型,用 FastAPI 做成 /predict 介面,就能讓別人輸入資料馬上得到結果。 對 AI 團隊來說:開發快、上線
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
要如何使用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的框架中究竟要如何使用呢? 首
Thumbnail
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
Thumbnail
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News