物件充當元件的入口和出口點,充當資料流的基本閘道。為了創建健全、可維護的元件,必須在這些物件中定義清晰、結構良好的欄位。這確保了不同系統部分之間的資料完整性和可靠互動。就我個人而言,我更喜歡使用 Python 和 FastAPI 框架來開發現代的高效能 API。對於資料驗證,Pydantic 是我選擇的函式庫,它與 FastAPI 無縫集成,以優雅地強制執行欄位約束並保持整個系統的一致性。
from fastapi import FastAPI, HTTPException from pydantic import BaseModel, EmailStr, Field, ValidationError, conint # FastAPI instance app = FastAPI() # Pydantic model for request body validation class User(BaseModel): name: str = Field(..., min_length=3, max_length=50, description="Name must be between 3 and 50 characters") age: conint(gt=0, le=120) = Field(..., description="Age must be between 1 and 120") # Constrained integer type email: EmailStr = Field(..., description="Must be a valid email address") # API route to handle user data submission @app.post("/create-user/") async def create_user(user: User): try: # If validation passes, this will run return {"message": f"User {user.name} created successfully!"} except ValidationError as e: # Catch and return validation errors raise HTTPException(status_code=400, detail=e.errors()) # Sample invalid data invalid_data = {"name": "A", "age": -5, "email": "invalid_email"} # Simulate calling the route with invalid data @app.get("/test-invalid-data/") async def test_invalid_data(): try: user = User(**invalid_data) # Validation will fail here except ValidationError as e: return {"error": e.errors()} # Run the server using: uvicorn <filename>:app --reload
在此範例中,我們示範了 FastAPI 和 Pydantic 如何協同工作以有效處理資料驗證。使用 Pydantic 的 BaseModel,我們定義傳入請求資料的驗證規則。例如,我們利用 EmailStr 自動驗證電子郵件格式,從而簡化了流程,而無需自訂正規表示式。同樣,我們使用 conint(一種受約束的整數類型)來確保年齡落在從 1 到 120 的特定範圍內。這種方法增強了可讀性和安全性。
在範例程式碼中,使用者模型由姓名、年齡和電子郵件等欄位定義,每個欄位都有其驗證標準。當使用者透過 /create-user/ 路由提交資料時,FastAPI 會自動根據這些規則驗證輸入。如果有效,使用者建立成功;如果沒有,FastAPI 會引發 400 Bad Request 並包含詳細的錯誤訊息。這顯著降低了處理不正確或惡意資料的風險,使 FastAPI 成為安全 API 開發的強大選擇。
Pydantic v2 引入了模型級驗證,讓您可以使用 @model_validator 裝飾器驗證彼此相關的多個欄位。此驗證在欄位驗證之後運行,對於確保滿足欄位之間的某些條件特別有用。例如,您可能想要確認事件模型中的 start_date 發生在 end_date 之前:
from pydantic import BaseModel, model_validator from datetime import date class Event(BaseModel): name: str start_date: date end_date: date @model_validator(mode='after') def check_dates(cls, values): start, end = values.get('start_date'), values.get('end_date') if start and end and start >= end: raise ValueError('start_date must be before end_date') return values
在此範例中,@model_validator 檢查 start_date 是否早於 end_date。如果不滿足此條件,Pydantic 會引發驗證錯誤。這種模型級驗證有利於確保準確執行多個欄位之間的關係。
Pydantic 允許透過重寫 dict() 或 json() 方法來自訂模型欄位的序列化。當您想要在序列化期間修改輸出格式或排除某些欄位時,這非常有用。您也可以使用 @property 裝飾器新增包含在序列化中但不屬於模型原始資料一部分的計算欄位。
下面是自訂序列化的範例,它修改了全名的返回方式,同時從序列化輸出中排除密碼欄位:
from pydantic import BaseModel class User(BaseModel): first_name: str last_name: str password: str # Custom serialization to return the full name @property def full_name(self): return f"{self.first_name} {self.last_name}" # Overriding dict() to exclude the password def dict(self, **kwargs): result = super().dict(**kwargs) result['full_name'] = self.full_name # Add computed field result.pop('password', None) # Remove password from serialization return result # Example usage user = User(first_name="John", last_name="Doe", password="secret123") print(user.dict())
在此範例中,full_name 是一個計算屬性,我們重寫 dict() 方法以確保從輸出中排除密碼。像這樣的自訂序列化提供了對模型資料如何在 API 或回應中公開的細粒度控制。
Pydantic 與 FastAPI 無縫集成,為請求負載、查詢參數和路徑參數提供自動資料驗證。當您在 FastAPI 端點中定義 Pydantic 模型時,FastAPI 會根據模型的規則自動處理傳入資料的解析和驗證。如果資料無效,FastAPI 將傳回詳細的 422 Unprocessable Entity 回應,並包含明確的錯誤訊息。
這是一個簡單的例子:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class User(BaseModel): username: str age: int @app.post("/users/") async def create_user(user: User): return {"message": f"User {user.username} created successfully!"}
在此範例中,當 POST 要求傳送至 /users/ 時,FastAPI 使用 Pydantic 來驗證傳入的 JSON 資料。如果資料不符合使用者模型(例如,缺少使用者名稱或無效年齡),FastAPI 會自動傳回錯誤回應,從而簡化輸入驗證和錯誤處理。
總之,使用 Pydantic 和 FastAPI 可以透過明確的驗證來確保資料完整性,從而增強您創建健全、可維護的應用程式的能力。這種強大的組合簡化了開發流程,同時提高了安全性和可靠性,使其成為建立現代 API 的首選。
FastAPI 中的 Pydantic 功能
Pydantic V2 計劃
以上是使用 FastAPI 和 Pydantic 建立強大的元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!