限時公開

【🔒 Python API框架篇 - FastAPI】Ep.2 資料驗證與文檔範例生成

更新於 發佈於 閱讀時間約 7 分鐘
raw-image


API是我們與其他系統介接的標準化規格, 那一份好的規格勢必要能夠達到引導與驗證的作用, 避免對方介接錯誤, 引發後續的災難性損失, 因此這一章節就是要教我們如何定義每個API的欄位怎麼填? 資料型態是什麼? 以及如何生成API文件。


我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」稍微帶大家認識了FastAPI這個框架, 它讓我們快速的架設一個API服務, 並提供了許多標準化功能, 只要照著規範走就能快速的開發出來, 那這個章節我們主要介紹的是「資料驗證」、「資料綱要」這兩個部份, 其中扮演重要的套件庫角色的便是「pydantic」這套工具, 就讓我們來好好的認識一番吧!


它有以下的功能:

  • 資料驗證:驗證輸入資料是否符合定義的格式或類型。
  • 數據模型管理:將不規範的輸入資料轉換為 Python 資料類型,並提供類型提示(Type Hints)。
  • 自動轉換:將不同類型的資料(例如字串到日期、整數到浮點數)自動轉換。
  • 錯誤處理:提供清晰的錯誤訊息,幫助開發者快速定位和解決資料問題。


安裝套件

pip install fastapi uvicorn

這裡我們可能會覺得奇怪, 為什麼不用裝pydantic呢? 主要是因為這個套件已經被整合到fastapi裡面的其中一個依賴了, 因此我們安裝fastapi時就會自動安裝pydantic了。


一個簡單的使用範例

我們可以發現到, 雖然id=”123”是字串的形式帶入, 但由於我們的資料模型定義為整數, 因此會自動幫我們進行轉換。

from pydantic import BaseModel

# 類別User繼承自BaseModel的特性, pydantic會自動根據我們的型別設計進行轉換及驗證。
class User(BaseModel):
id: int
name: str
is_active: bool = True

# 驗證與轉換輸入資料
user_data = {"id": "123", "name": "Alice"}
user = User(**user_data)

print(user) # User(id=123, name='Alice', is_active=True)
print(user.dict()) # {'id': 123, 'name': 'Alice', 'is_active': True}



當驗證發生錯誤時

根據上面的案例進行一些修改, 我們將id的部份改為error字串, 看看會發生什麼事情?

from pydantic import BaseModel

class User(BaseModel):
id: int
name: str
is_active: bool = True

# 驗證與轉換輸入資料
user_data = {"id": "error", "name": "Alice"}
user = User(**user_data)

print(user) # User(id=123, name='Alice', is_active=True)
print(user.dict()) # {'id': 123, 'name': 'Alice', 'is_active': True}

這段程式碼將發生驗證錯誤, 並且明確的告訴我們 id是整數, 我們卻帶入字串的資料。

raw-image


與FastAPI整合

這是最關鍵的部份, FastAPI在資料及文檔生成的部份整合了pydantic的套件, 幫助我們在產品的文件化、資料的驗證上更加的具有品質, 減少錯誤的認知開發與錯誤的輸入導致系統當機, 接下來我們試著來寫一段資料模型定義與驗證的程式碼:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

# 定義 Pydantic 模型
class Item(BaseModel):
name: str
price: float
is_offer: bool = False

# 建立 POST 路由來處理資料
@app.post("/items/")
async def create_item(item: Item):
return {"message": "Item created successfully!", "item": item}

# 建立 GET 路由來取得資料
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}


接著我們來啟動服務:

uvicorn test:app --reload --port 9880 --host 0.0.0.0


我們可以看到 http://localhost:9880/docs 裡面會包含我們所定義的資料綱要及型別。

raw-image



接著我們嘗試依照範例去請求!

raw-image


透過這樣的互動方式, 讓我們更快的理解API如何使用及設計的含意。



結語

過往我們在設計API文件時, 通常都會草擬一份文件並討論之後再開始進行開發, 但這樣的過程難免會有設計與開發不一致的情況, 且來來回回都不知道浪費多少時間去了, 因此現代的開發框架通常結合程式碼進行文檔的生成, 及欄位的範例設計, 讓註解、文件、驗證達到三位一體的效果, 省去許多整合的時間。


當然 pydantic 不僅只有在FastAPI發揮功能而已, 它也可以替我們的環境變數配置進行資料設計及驗證, 歡迎參考我們的:

【💊 Python的解憂錦囊】既能管理環境變數又能驗證的pydantic

avatar-img
118會員
266內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
INI 檔案是一種配置檔案格式,常用於保存設定資料和組態資訊。 它使用簡單的鍵值對結構來組織資料,通常用於程式、應用程式或操作系統中的配置和初始化設定。 INI 檔案每個鍵值對包含一個名稱(鍵)和對應的值。 基本的檔案格式如下: [Section1] Key1 = Value1 Key2 =
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
在 Python 中,正則表達式和 JSON 處理,能幫我們有效率的處理文本數據,本文將介紹如何使用正則表達式進行文本分析,以及如何處理和操作JSON數據。
Thumbnail
函式是 Python 程式設計中的非常重要的一環,能夠增強程式碼的可讀性和重用性。本文將介紹函式的基本觀念,包含函式的定義、調用、參數類型、返回值,以及在不同範圍內的行為。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
INI 檔案是一種配置檔案格式,常用於保存設定資料和組態資訊。 它使用簡單的鍵值對結構來組織資料,通常用於程式、應用程式或操作系統中的配置和初始化設定。 INI 檔案每個鍵值對包含一個名稱(鍵)和對應的值。 基本的檔案格式如下: [Section1] Key1 = Value1 Key2 =
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
※ 什麼是 RESTful API? 這種運用 HTTP 來表達語義的路由設計風格稱為 RESTful API,它描述了如何實現 Web API 的架構。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當這產品的這個 API 被呼叫,再從回傳內容的某個欄位欄位來判斷,只要“這個欄位”顯示 false 就代表不支援」,雖然這樣的設計也能滿足功能需求…
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
在 Python 中,正則表達式和 JSON 處理,能幫我們有效率的處理文本數據,本文將介紹如何使用正則表達式進行文本分析,以及如何處理和操作JSON數據。
Thumbnail
函式是 Python 程式設計中的非常重要的一環,能夠增強程式碼的可讀性和重用性。本文將介紹函式的基本觀念,包含函式的定義、調用、參數類型、返回值,以及在不同範圍內的行為。