跳至內容

特色

FastAPI 的特色

FastAPI 提供以下功能:

基於開放標準

  • 使用 OpenAPI 建立 API,包含宣告 路徑 操作、參數、請求主體、安全性等。
  • 使用 JSON Schema 自動產生資料模型文件(因為 OpenAPI 本身基於 JSON Schema)。
  • 經過仔細研究,圍繞這些標準設計,而非事後才加上去的一層。
  • 這也允許多種語言自動產生**客戶端程式碼**。

自動產生文件

提供互動式 API 文件和探索網頁使用者介面。由於框架基於 OpenAPI,因此有多種選項,預設包含兩種。

  • Swagger UI,具有互動式探索功能,可直接從瀏覽器呼叫和測試您的 API。

Swagger UI interaction

  • 使用 ReDoc 的替代 API 文件。

ReDoc

現代 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 框架都以此為基礎。自動完成功能無所不在。

您將很少需要返回文件。

以下是您的編輯器如何幫助您

editor support

editor support

您甚至可以在以前認為不可能的程式碼中獲得自動完成。例如,來自請求的 JSON 主體(可能已巢狀)中的 price 鍵。

不再輸入錯誤的鍵名,在文件之間來回切換,或上下捲動以查找您最終使用的是 username 還是 user_name

簡潔

它為所有內容提供合理的**預設值**,並在各處提供可選配置。所有參數都可以微調以滿足您的需求並定義您需要的 API。

但預設情況下,一切都**「正常運作」**。

驗證

  • 驗證大多數(或所有?)Python **資料類型**,包括

    • JSON 物件 (dict)。
    • 定義項目類型的 JSON 陣列 (list)。
    • 定義最小和最大長度的字串 (str) 欄位。
    • 數值(intfloat)含最小值、最大值等。
  • 驗證更多特殊類型,例如:

    • 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 框架之一,與 NodeJSGo 並駕齊驅
  • 支援 WebSocket
  • 程序內背景任務。
  • 啟動和關閉事件。
  • 基於 HTTPX 建構的測試用戶端。
  • CORS、GZip、靜態檔案、串流回應。
  • 支援 Session 和 Cookie
  • 100% 測試覆蓋率。
  • 100% 類型註釋的程式碼庫。

Pydantic 功能

FastAPI 完全相容於(且基於)Pydantic。因此,您擁有的任何其他 Pydantic 程式碼也能正常運作。

也包含基於 Pydantic 的外部函式庫,例如資料庫的 ORMODM

這也意味著在許多情況下,您可以將從請求中取得的物件直接傳遞到資料庫,因為所有內容都會自動驗證。

反之亦然,在許多情況下,您可以將從資料庫中取得的物件直接傳遞到客戶端

使用 FastAPI,您將獲得 Pydantic 的所有功能(因為 FastAPI 基於 Pydantic 進行所有資料處理)

  • 沒有惱人的問題:
    • 無需學習新的 schema 定義微型語言。
    • 如果您了解 Python 類型,您就知道如何使用 Pydantic。
  • 與您的 IDE/程式碼檢查器/大腦 良好地配合
    • 因為 Pydantic 資料結構只是您定義的類別的實例;自動完成、程式碼檢查、mypy 和您的直覺都應該可以與您的已驗證資料正常運作。
  • 驗證複雜的結構
    • 使用階層式 Pydantic 模型、Python typingListDict 等等。
    • 驗證器允許以清晰簡潔的方式定義、檢查複雜的資料結構,並以 JSON Schema 的形式記錄。
    • 您可以擁有深度巢狀的 JSON 物件,並讓它們全部經過驗證和註釋。
  • 可擴充性:
    • Pydantic 允許定義自訂資料類型,或者您可以使用以 validator 裝飾器裝飾的模型上的方法來擴展驗證。
  • 100% 測試覆蓋率。