特色¶
FastAPI 的特色¶
FastAPI 提供以下功能:
基於開放標準¶
- 使用 OpenAPI 建立 API,包含宣告 路徑 操作、參數、請求主體、安全性等。
- 使用 JSON Schema 自動產生資料模型文件(因為 OpenAPI 本身基於 JSON Schema)。
- 經過仔細研究,圍繞這些標準設計,而非事後才加上去的一層。
- 這也允許多種語言自動產生**客戶端程式碼**。
自動產生文件¶
提供互動式 API 文件和探索網頁使用者介面。由於框架基於 OpenAPI,因此有多種選項,預設包含兩種。
- Swagger UI,具有互動式探索功能,可直接從瀏覽器呼叫和測試您的 API。
- 使用 ReDoc 的替代 API 文件。
現代 Python¶
它完全基於標準的 **Python 類型** 宣告(感謝 Pydantic)。無需學習新的語法。只需標準的現代 Python。
如果您需要 2 分鐘快速複習如何使用 Python 類型(即使您不使用 FastAPI),請查看簡短教學:Python 類型。
您撰寫帶有類型的標準 Python 程式碼
from datetime import date
from pydantic import BaseModel
# Declare a variable as a str
# and get editor support inside the function
def main(user_id: str):
return user_id
# A Pydantic model
class User(BaseModel):
id: int
name: str
joined: date
然後可以像這樣使用
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
second_user_data = {
"id": 4,
"name": "Mary",
"joined": "2018-11-30",
}
my_second_user: User = User(**second_user_data)
資訊
**second_user_data
表示
直接將 second_user_data
字典的鍵和值作為鍵值參數傳遞,相當於:User(id=4, name="Mary", joined="2018-11-30")
編輯器支援¶
整個框架的設計易於使用且直觀,所有決策在開始開發之前都在多個編輯器上進行了測試,以確保最佳的開發體驗。
在 Python 開發者調查中,很明顯 最常用的功能之一是「自動完成」。
整個 FastAPI 框架都以此為基礎。自動完成功能無所不在。
您將很少需要返回文件。
以下是您的編輯器如何幫助您
- 在 PyCharm 中
您甚至可以在以前認為不可能的程式碼中獲得自動完成。例如,來自請求的 JSON 主體(可能已巢狀)中的 price
鍵。
不再輸入錯誤的鍵名,在文件之間來回切換,或上下捲動以查找您最終使用的是 username
還是 user_name
。
簡潔¶
它為所有內容提供合理的**預設值**,並在各處提供可選配置。所有參數都可以微調以滿足您的需求並定義您需要的 API。
但預設情況下,一切都**「正常運作」**。
驗證¶
-
驗證大多數(或所有?)Python **資料類型**,包括
- JSON 物件 (
dict
)。 - 定義項目類型的 JSON 陣列 (
list
)。 - 定義最小和最大長度的字串 (
str
) 欄位。 - 數值(
int
、float
)含最小值、最大值等。
- JSON 物件 (
-
驗證更多特殊類型,例如:
- URL。
- Email。
- UUID。
- ...以及其他。
所有驗證皆由完善且穩健的 Pydantic 處理。
安全性與驗證¶
整合安全性與驗證。無須與資料庫或資料模型妥協。
OpenAPI 定義的所有安全性方案,包含:
- HTTP Basic。
- OAuth2(也支援 JWT 權杖)。請參考關於 OAuth2 與 JWT 的教學。
- API 金鑰位於:
- 標頭(Headers)。
- 查詢參數(Query parameters)。
- Cookie 等。
加上 Starlette 的所有安全功能(包含 Session Cookie)。
所有功能皆以可重複使用的工具和組件建構,易於與您的系統、資料儲存庫、關聯式和 NoSQL 資料庫等整合。
依賴注入¶
FastAPI 包含一個極易使用但功能極為強大的 依賴注入 系統。
- 即使是依賴項也可以有其自身的依賴項,從而建立依賴項的階層或 「依賴圖」。
- 所有流程皆由框架 自動處理。
- 所有依賴項都可以要求來自請求的數據,並 擴充路徑操作 的限制和自動文件。
- 即使是依賴項中定義的路徑操作參數,也能進行 自動驗證。
- 支援複雜的使用者驗證系統、資料庫連線 等。
- 無須與資料庫、前端等 妥協。但可輕鬆與所有這些整合。
無限「插件」¶
或者換句話說,不需要插件,直接導入並使用您需要的程式碼。
任何整合的設計都非常易於使用(透過依賴注入),您可以使用與路徑操作相同的結構和語法,以兩行程式碼為您的應用程式建立「插件」。
測試¶
- 100% 測試覆蓋率。
- 100% 類型註釋 的程式碼庫。
- 已用於生產環境應用程式。
Starlette 功能¶
FastAPI 完全相容於(且基於)Starlette。因此,您擁有的任何其他 Starlette 程式碼也能正常運作。
FastAPI
實際上是 Starlette
的子類別。因此,如果您已經了解或使用 Starlette,大部分功能的運作方式都相同。
使用 FastAPI,您可以獲得所有 Starlette 的功能(因為 FastAPI 就像是強化版的 Starlette)
- 令人驚艷的效能。它是現有最快的 Python 框架之一,與 NodeJS 和 Go 並駕齊驅。
- 支援 WebSocket。
- 程序內背景任務。
- 啟動和關閉事件。
- 基於 HTTPX 建構的測試用戶端。
- CORS、GZip、靜態檔案、串流回應。
- 支援 Session 和 Cookie。
- 100% 測試覆蓋率。
- 100% 類型註釋的程式碼庫。
Pydantic 功能¶
FastAPI 完全相容於(且基於)Pydantic。因此,您擁有的任何其他 Pydantic 程式碼也能正常運作。
也包含基於 Pydantic 的外部函式庫,例如資料庫的 ORM 和 ODM。
這也意味著在許多情況下,您可以將從請求中取得的物件直接傳遞到資料庫,因為所有內容都會自動驗證。
反之亦然,在許多情況下,您可以將從資料庫中取得的物件直接傳遞到客戶端。
使用 FastAPI,您將獲得 Pydantic 的所有功能(因為 FastAPI 基於 Pydantic 進行所有資料處理)
- 沒有惱人的問題:
- 無需學習新的 schema 定義微型語言。
- 如果您了解 Python 類型,您就知道如何使用 Pydantic。
- 與您的 IDE/程式碼檢查器/大腦 良好地配合
- 因為 Pydantic 資料結構只是您定義的類別的實例;自動完成、程式碼檢查、mypy 和您的直覺都應該可以與您的已驗證資料正常運作。
- 驗證複雜的結構
- 使用階層式 Pydantic 模型、Python
typing
的List
和Dict
等等。 - 驗證器允許以清晰簡潔的方式定義、檢查複雜的資料結構,並以 JSON Schema 的形式記錄。
- 您可以擁有深度巢狀的 JSON 物件,並讓它們全部經過驗證和註釋。
- 使用階層式 Pydantic 模型、Python
- 可擴充性:
- Pydantic 允許定義自訂資料類型,或者您可以使用以 validator 裝飾器裝飾的模型上的方法來擴展驗證。
- 100% 測試覆蓋率。