【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會員
2內容數
梧笙,取意吾生,在網路世界留下我的痕跡。
你可能也想看
Thumbnail
最近整理了一下蝦皮的訂單紀錄,發現自己這一年默默也回購了不少好用的東西~從生活療癒系的小物、實用的除臭保養、到打掃家裡必備的清潔用品都有。這次也順便一起整理了「準備在雙12補貨的清單」,如果剛好你也有在找類似的品項,希望這篇可以給你一些參考。 秘魯進口 高油版聖木 這款聖木我覺得很棒,就是聞起來
Thumbnail
最近整理了一下蝦皮的訂單紀錄,發現自己這一年默默也回購了不少好用的東西~從生活療癒系的小物、實用的除臭保養、到打掃家裡必備的清潔用品都有。這次也順便一起整理了「準備在雙12補貨的清單」,如果剛好你也有在找類似的品項,希望這篇可以給你一些參考。 秘魯進口 高油版聖木 這款聖木我覺得很棒,就是聞起來
Thumbnail
在這個網購紅海時代,你是否也跟作者一樣,最後總是點開蝦皮?從拯救文字工作者的老腰的護脊椅墊,到深夜腦力激盪必備的韓國不倒翁泡麵,作者分享了雙12購物清單中的兩樣「生存」與「靈魂」好物。更重要的是,文章揭露了「蝦皮分潤計畫」如何讓創作者低門檻變現,填滿你的小荷包,實現數位遊牧的夢想。
Thumbnail
在這個網購紅海時代,你是否也跟作者一樣,最後總是點開蝦皮?從拯救文字工作者的老腰的護脊椅墊,到深夜腦力激盪必備的韓國不倒翁泡麵,作者分享了雙12購物清單中的兩樣「生存」與「靈魂」好物。更重要的是,文章揭露了「蝦皮分潤計畫」如何讓創作者低門檻變現,填滿你的小荷包,實現數位遊牧的夢想。
Thumbnail
生完寶寶後 我真的深刻感受到一句話: 「睡不好,皮膚就先離家出走」 常常半夜起來哄寶寶、睡眠不規律 膚況也跟著黯淡、失去彈性>< 身為剛生完孩子的新手媽媽,我現在最在意的兩件事就是: 皮膚要彈潤、睡眠要穩定!! 這陣子我開始嘗試日夜搭配的膠原蛋白: 🌞 TIMESEAL 日間款
Thumbnail
生完寶寶後 我真的深刻感受到一句話: 「睡不好,皮膚就先離家出走」 常常半夜起來哄寶寶、睡眠不規律 膚況也跟著黯淡、失去彈性>< 身為剛生完孩子的新手媽媽,我現在最在意的兩件事就是: 皮膚要彈潤、睡眠要穩定!! 這陣子我開始嘗試日夜搭配的膠原蛋白: 🌞 TIMESEAL 日間款
Thumbnail
發現每天固定一個小動作,肌膚整體狀態真的會更穩定,照鏡子的心情也跟著好起來。 早上我習慣吃一包 TIMESEAL 早安膠原蛋白,粉末狀、很好入口,使用小分子技術,搭配維生素C與專利原料 ( 雙胜肽膠原、PANMOL® NADH)。對我來說,就是先把一天的彈潤感打好底,也讓整天狀態更有精神。 晚
Thumbnail
發現每天固定一個小動作,肌膚整體狀態真的會更穩定,照鏡子的心情也跟著好起來。 早上我習慣吃一包 TIMESEAL 早安膠原蛋白,粉末狀、很好入口,使用小分子技術,搭配維生素C與專利原料 ( 雙胜肽膠原、PANMOL® NADH)。對我來說,就是先把一天的彈潤感打好底,也讓整天狀態更有精神。 晚
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
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News