【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
梧笙 WuSheng 的沙龍
65會員
17內容數
⛰️ 梧笙,意即「吾生」,我是一個平凡的理工宅男。 生活離不開 Code 與 Game,這裡主要紀錄與分享: 📖 學習筆記|紀錄我學習過的電腦技能與知識。 💻 科技新知|整理實用工具與科技領域的資訊。 🎮 電玩娛樂|聊聊遊戲動漫與實況直播的話題。 目前更新頻率不固定,有興趣歡迎追蹤。
你可能也想看
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
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
FastAPI 是什麼?為什麼選它? 這是一個用 Python 寫的超輕量 Web API 框架,速度快、語法直觀。 適合拿來把你的模型包裝成 API,如你訓練好一個分類模型,用 FastAPI 做成 /predict 介面,就能讓別人輸入資料馬上得到結果。 對 AI 團隊來說:開發快、上線
Thumbnail
FastAPI 是什麼?為什麼選它? 這是一個用 Python 寫的超輕量 Web API 框架,速度快、語法直觀。 適合拿來把你的模型包裝成 API,如你訓練好一個分類模型,用 FastAPI 做成 /predict 介面,就能讓別人輸入資料馬上得到結果。 對 AI 團隊來說:開發快、上線
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 但開發出來之後, 我們會希望開放給一般使用者使用, 而一般使用者較能夠操作的媒介
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 但開發出來之後, 我們會希望開放給一般使用者使用, 而一般使用者較能夠操作的媒介
Thumbnail
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
Thumbnail
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
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 來共享資料與管理生命週期
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News