FastAPI 特性

2022-08-19 17:59 更新

FastAPI 提供了以下內(nèi)容:

基于開(kāi)放標(biāo)準(zhǔn)

  • 用于創(chuàng)建 API 的 OpenAPI 包含了路徑操作,請(qǐng)求參數(shù),請(qǐng)求體,安全性等的聲明。
  • 使用 JSON Schema (因?yàn)?OpenAPI 本身就是基于 JSON Schema 的)自動(dòng)生成數(shù)據(jù)模型文檔。
  • 經(jīng)過(guò)了縝密的研究后圍繞這些標(biāo)準(zhǔn)而設(shè)計(jì)。并非狗尾續(xù)貂。
  • 這也允許了在很多語(yǔ)言中自動(dòng)生成客戶端代碼。

自動(dòng)生成文檔

交互式 API 文檔以及具探索性 web 界面。因?yàn)樵摽蚣苁腔?OpenAPI,所以有很多可選項(xiàng),F(xiàn)astAPI 默認(rèn)自帶兩個(gè)交互式 API 文檔。

  • Swagger UI,可交互式操作,能在瀏覽器中直接調(diào)用和測(cè)試你的 API 。


  • 另外的 API 文檔:ReDoc


更主流的 Python

全部都基于標(biāo)準(zhǔn)的 Python 3.6 類型聲明(感謝 Pydantic )。沒(méi)有新的語(yǔ)法需要學(xué)習(xí)。只需要標(biāo)準(zhǔn)的 Python 。

如果你需要2分鐘來(lái)學(xué)習(xí)如何使用 Python 類型(即使你不使用 FastAPI ),看看這個(gè)簡(jiǎn)短的教程:Python Types

編寫(xiě)帶有類型標(biāo)注的標(biāo)準(zhǔn) 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

可以像這樣來(lái)使用:

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)

Info

**second_user_data 意思是:

直接將second_user_data字典的鍵和值直接作為key-value參數(shù)傳遞,等同于:User(id=4, name="Mary", joined="2018-11-30")

編輯器支持

整個(gè)框架都被設(shè)計(jì)得易于使用且直觀,所有的決定都在開(kāi)發(fā)之前就在多個(gè)編輯器上進(jìn)行了測(cè)試,來(lái)確保最佳的開(kāi)發(fā)體驗(yàn)。

在最近的 Python 開(kāi)發(fā)者調(diào)查中,我們能看到 被使用最多的功能是"自動(dòng)補(bǔ)全"。

整個(gè) FastAPI 框架就是基于這一點(diǎn)的。任何地方都可以進(jìn)行自動(dòng)補(bǔ)全。

你幾乎不需要經(jīng)常回來(lái)看文檔。

在這里,你的編輯器可能會(huì)這樣幫助你:

  • Visual Studio Code 中:

editor support

  • PyCharm 中:

editor support

你將能進(jìn)行代碼補(bǔ)全,這是在之前你可能曾認(rèn)為不可能的事。例如,在來(lái)自請(qǐng)求 JSON 體(可能是嵌套的)中的鍵 price。

不會(huì)再輸錯(cuò)鍵名,來(lái)回翻看文檔,或者來(lái)回滾動(dòng)尋找你最后使用的 username 或者 user_name 。

簡(jiǎn)潔

任何類型都有合理的默認(rèn)值,任何和地方都有可選配置。所有的參數(shù)被微調(diào),來(lái)滿足你的需求,定義成你需要的 API。

但是默認(rèn)情況下,一切都能“順利工作”。

驗(yàn)證

  • 校驗(yàn)大部分(甚至所有?)的 Python 數(shù)據(jù)類型,包括:JSON 對(duì)象 (dict).JSON 數(shù)組 (list) 定義成員類型。字符串 (str) 字段, 定義最小或最大長(zhǎng)度。數(shù)字 (int, float) 有最大值和最小值, 等等。
  • 校驗(yàn)外來(lái)類型, 比如:URL.Email.UUID....及其他.

所有的校驗(yàn)都由完善且強(qiáng)大的 Pydantic 處理。

安全性及身份驗(yàn)證

集成了安全性和身份認(rèn)證。杜絕數(shù)據(jù)庫(kù)或者數(shù)據(jù)模型的滲透風(fēng)險(xiǎn)。

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

  • HTTP 基本認(rèn)證。
  • OAuth2 (也使用 JWT tokens)。
  • API 密鑰,在:請(qǐng)求頭。查詢參數(shù)。Cookies, 等等。

加上來(lái)自 Starlette(包括 session cookie)的所有安全特性。

所有的這些都是可復(fù)用的工具和組件,可以輕松與你的系統(tǒng),數(shù)據(jù)倉(cāng)庫(kù),關(guān)系型以及 NoSQL 數(shù)據(jù)庫(kù)等等集成。

依賴注入

FastAPI 有一個(gè)使用非常簡(jiǎn)單,但是非常強(qiáng)大的依賴注入系統(tǒng)。

  • 甚至依賴也可以有依賴,創(chuàng)建一個(gè)層級(jí)或者“圖”依賴。
  • 所有自動(dòng)化處理都由框架完成。
  • 所有的依賴關(guān)系都可以從請(qǐng)求中獲取數(shù)據(jù),并且增加了路徑操作約束和自動(dòng)文檔生成。
  • 即使在依賴項(xiàng)中被定義的路徑操作 也會(huì)自動(dòng)驗(yàn)證。
  • 支持復(fù)雜的用戶身份認(rèn)證系統(tǒng),數(shù)據(jù)庫(kù)連接等等。
  • 不依賴數(shù)據(jù)庫(kù),前端等。 但是和它們集成很簡(jiǎn)單。

無(wú)限制"插件"

或者說(shuō),導(dǎo)入并使用你需要的代碼,而不需要它們。

任何集成都被設(shè)計(jì)得被易于使用(用依賴關(guān)系),你可以用和路徑操作相同的結(jié)構(gòu)和語(yǔ)法,在兩行代碼中為你的應(yīng)用創(chuàng)建一個(gè)“插件”。

測(cè)試

  • 100% 測(cè)試覆蓋。
  • 代碼庫(kù)100% 類型注釋。
  • 用于生產(chǎn)應(yīng)用。

Starlette 特性

FastAPI 和 Starlette 完全兼容(并基于)。所以,你有的其他的 Starlette 代碼也能正常工作。FastAPI 實(shí)際上是 Starlette的一個(gè)子類。所以,如果你已經(jīng)知道或者使用 Starlette,大部分的功能會(huì)以相同的方式工作。

通過(guò) FastAPI 你可以獲得所有 Starlette 的特性 ( FastAPI 就像加強(qiáng)版的 Starlette ):

  • 令人驚嘆的性能。它是 Python 可用的最快的框架之一,和 NodeJS 及 Go 相當(dāng)。
  • 支持 WebSocket 。
  • 支持 GraphQL 。
  • 后臺(tái)任務(wù)處理。
  • Startup 和 shutdown 事件。
  • 測(cè)試客戶端基于 requests。
  • CORS, GZip, 靜態(tài)文件, 流響應(yīng)。
  • 支持 Session 和 Cookie 。
  • 100% 測(cè)試覆蓋率。
  • 代碼庫(kù) 100% 類型注釋。

Pydantic 特性

FastAPI 和 Pydantic 完全兼容(并基于)。所以,你有的其他的 Pydantic 代碼也能正常工作。

兼容包括基于 Pydantic 的外部庫(kù), 例如用與數(shù)據(jù)庫(kù)的 ORMs, ODMs。

這也意味著在很多情況下,你可以將從請(qǐng)求中獲得的相同對(duì)象直接傳到數(shù)據(jù)庫(kù),因?yàn)樗械尿?yàn)證都是自動(dòng)的。

反之亦然,在很多情況下,你也可以將從數(shù)據(jù)庫(kù)中獲取的對(duì)象直接傳到客戶端。

通過(guò) FastAPI 你可以獲得所有 Pydantic (FastAPI 基于 Pydantic 做了所有的數(shù)據(jù)處理):

  • 更簡(jiǎn)單:沒(méi)有新的模式定義 micro-language 需要學(xué)習(xí)。如果你知道 Python types,你就知道如何使用 Pydantic。
  • 和你 IDE/linter/brain 適配:因?yàn)?pydantic 數(shù)據(jù)結(jié)構(gòu)僅僅是你定義的類的實(shí)例;自動(dòng)補(bǔ)全,linting,mypy 以及你的直覺(jué)應(yīng)該可以和你驗(yàn)證的數(shù)據(jù)一起正常工作。
  • 更快:在 基準(zhǔn)測(cè)試 中,Pydantic 比其他被測(cè)試的庫(kù)都要快。
  • 驗(yàn)證復(fù)雜結(jié)構(gòu):使用分層的 Pydantic 模型, Python typing的 List 和 Dict 等等。驗(yàn)證器使我們能夠簡(jiǎn)單清楚的將復(fù)雜的數(shù)據(jù)模式定義、檢查并記錄為 JSON Schema。你可以擁有深度嵌套的 JSON 對(duì)象并對(duì)它們進(jìn)行驗(yàn)證和注釋。
  • 可擴(kuò)展:Pydantic 允許定義自定義數(shù)據(jù)類型或者你可以用驗(yàn)證器裝飾器對(duì)被裝飾的模型上的方法擴(kuò)展驗(yàn)證。
  • 100% 測(cè)試覆蓋率。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)