You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

9.1 KiB

特性

FastAPI 特性

FastAPI 提供了以下內容:

建立在開放標準的基礎上

  • 使用 OpenAPI 來建立 API,包含 路徑 操作、參數、請求內文、安全性等宣告。
  • 使用 JSON Schema(因為 OpenAPI 本身就是基於 JSON Schema)自動生成資料模型文件。
  • 經過縝密的研究後圍繞這些標準進行設計,而不是事後在已有系統上附加的一層功能。
  • 這也讓我們在多種語言中可以使用自動用戶端程式碼生成

能夠自動生成文件

互動式 API 文件與探索用的 Web 使用者介面。由於該框架基於 OpenAPI,因此有多種選擇,預設包含 2 種。

  • 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

# 將變數宣告為 str
# 並在函式內取得 editor support
def main(user_id: str):
    return user_id


# 一個 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)

/// note

**second_user_data 意思是:

second_user_data dict 的 keys 和 values 直接作為 key-value 引數傳遞,等同於:User(id=4, name="Mary", joined="2018-11-30")

///

多種編輯器支援

整個框架的設計是為了讓使用變得簡單且直觀,在開始開發之前,所有決策都在多個編輯器上進行了測試,以確保提供最佳的開發體驗。

在 Python 開發者調查中,我們能清楚看到最常用的功能之一是「autocompletion」

整個 FastAPI 框架就是基於這一點,任何地方都可以進行自動補齊。

你很少需要回來查看文件。

在這裡,你的編輯器可能會這樣幫助你:

editor support

editor support

你將能進行程式碼補齊,這是在之前你可能曾認為不可能的事。例如,來自請求的 JSON body(可能是巢狀的)中的鍵 price

這樣比較不會輸錯鍵名,不用來回翻看文件,也不用來回滾動尋找你最後使用的 username 或者 user_name

簡潔

它為所有內容提供合理的預設值,並且每處都可選擇性設定。所有參數都可以微調,以完成你需要的行為並定義你需要的 API。

但預設情況下,一切都 「直接可用」

驗證

  • 驗證大部分(甚至所有?)的 Python 資料型別,包括:

    • JSON 物件 (dict)。
    • JSON 陣列 (list) 定義項目型別。
    • 字串 (str) 欄位,定義最小或最大長度。
    • 數字 (int, float) 與其最大值和最小值等。
  • 驗證較特殊的型別,比如:

    • URL。
    • Email。
    • UUID。
    • ...等等。

所有的驗證都由完善且強大的 Pydantic 處理。

安全性及身份驗證

FastAPI 已經整合了安全性和身份驗證的功能。不需在資料庫或資料模型上妥協。

OpenAPI 中定義的所有安全模式,包括:

  • HTTP 基本認證。
  • OAuth2(也使用 JWT tokens)。在 OAuth2 with JWT 查看教學。
  • API 密鑰,在:
    • 標頭。
    • 查詢參數。
    • Cookies,等等。

加上來自 Starlette(包括 session cookies)的所有安全特性。

所有的這些都是可重複使用的工具和元件,可以輕鬆與你的系統、資料儲存、關聯式和 NoSQL 資料庫等整合。

依賴注入(Dependency Injection)

FastAPI 有一個使用簡單,但是非常強大的 依賴注入 系統。

  • 依賴項甚至可以有自己的依賴,從而形成一個層級或**依賴項的「圖」**結構。
  • 所有自動化處理都由框架完成。
  • 所有依賴項都可以從請求中要求資料,並擴充路徑操作的限制條件與自動文件。
  • 即使是依賴項中定義的路徑操作參數,也會自動進行驗證
  • 支援複雜的使用者身份驗證系統、資料庫連接等。
  • 不需妥協資料庫、前端等。但能輕鬆整合它們。

無限制「擴充功能」

或者說,其實不需要它們,匯入並使用你需要的程式碼即可。

任何整合都被設計得非常簡單易用(通過依賴),你只需用與路徑操作相同的結構和語法,用 2 行程式碼就能為你的應用程式建立一個「plug-in」。

測試

  • 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 的外部函式庫,例如用於資料庫的 ORMs 和 ODMs。

這也意味著在很多情況下,你可以把從請求中獲得的相同物件直接傳到資料庫,因為所有資料都會自動進行驗證。

反之亦然,在很多情況下,你也可以把從資料庫中獲取的物件直接傳給客戶端

通過 FastAPI 你可以獲得所有 Pydantic 的特性(FastAPI 基於 Pydantic 做了所有的資料處理):

  • 不傷腦筋
    • 不需要學習新的 schema 定義 micro-language。
    • 如果你知道 Python 型別,你就知道如何使用 Pydantic。
  • 和你的 IDE/linter/brain 都能好好配合:
    • 因為 pydantic 的資料結構其實就是你自己定義的類別實例,所以自動補齊、linting、mypy 以及你的直覺都能很好地在經過驗證的資料上發揮作用。
  • 驗證複雜結構
    • 使用階層式 Pydantic 模型、Python typingListDict 等。
    • 驗證器讓我們可以輕鬆地定義和檢查複雜的資料結構,並把它們轉換成 JSON Schema 進行記錄。
    • 你可以擁有深層巢狀的 JSON 物件,並對它們進行驗證和註解。
  • 可擴充
    • Pydantic 讓我們可以定義客製化的資料型別,或者你可以使用帶有 validator 裝飾器的方法來擴充模型中的驗證功能。
  • 100% 測試覆蓋率。