本文講述了什么啟發了 FastAPI 的誕生,它與其他替代框架的對比,以及從中汲取的經驗。如果不是基于前人的成果,FastAPI 將不會存在。在 FastAPI 之前,前人已經創建了許多工具 。幾年來,我一直在避免創建新框架。首先,我嘗試使用許多不同的框架,插件和工具來解決 FastAPI 涵蓋的所有功能。
但是有時候,沒有更好的辦法,除了創建具有所有這些功能的東西,從以前的工具中汲取最佳創意,并以最佳方式將它們組合起來,使用以前甚至沒有的語言功能(Python 3.6+類型提示)。
啟發過 FastAPI 的框架
Django
Django 是最流行的 Python 框架,受到廣泛信任。它用于構建 Instagram 之類的系統。
它與關系數據庫(例如 MySQL 或 PostgreSQL)相對緊密地結合在一起,因此,以NoSQL 數據庫(例如 Couchbase,MongoDB,Cassandra 等)作為 django 的主存儲引擎并不是一件容易的事。
Django REST Framework
Django REST Framework 是一個非常靈活的框架,用于構建 Web API,以改善 Django 的 API 功能。
Mozilla,Red Hat 和 Eventbrite 等許多公司都使用它。
Django REST Framework 是第一個自動生成 API 文檔的框架,自動生成 API 的接口文檔是 FastAPI 框架誕生的緣由之一。
注意
Django REST Framework 框架的作者是 Tom Christie ,Tom Christie 也創造了 Starlette和 Uvicorn。FastAPI 正是建立在 Starlette 和 Uvicorn 的基礎之上。
啟發 FastAPI 地方:有一個自動 API 文檔,Web 用戶界面可供用戶測試。
Flask
Flask 是一種輕量級的框架,它不包括數據庫集成,也沒有很多的附帶的功能,雖然這Django 那里是默認提供的。
這個簡單性和靈活的特性允許使用 NoSQL 數據庫作為主數據存儲。盡管文檔在某些方面有所技術性,但它非常簡單,因此學習起來相對直觀。
它還常用于其他不需要數據庫,用戶管理或 Django 中預建功能的應用程序。盡管其中許多功能都可以通過添加插件來實現。
各個模塊之前的解耦,使之成為一個“微框架”,可以通過擴展為精確地提供所需的東西,這是我想要保留的一項關鍵功能。
考慮到 Flask 的簡單性,它似乎很適合構建 API。接下來要找到的是 Flask的 “ Django REST Framework”。
啟發 FastAPI 地方:成為一個微框架。易于混合和匹配所需的工具和零件。擁有一個簡單易用的路由系統。
Requests
FastAPI 實際上不是 Requests 的替代工具。它們的適用范圍非常不同。實際上,在FastAPI 應用程序內部使用 Requests 是很常見的。
但是,FastAPI 從 Requests 中獲得了很多啟發。Requests 是一個與API(作為客戶端)進行交互的庫,而 FastAPI 是一個用于構建 API(作為服務器)的庫。它們或多或少地處于相反的末端,彼此互補。Requests 具有非常簡單直觀的設計,非常易于使用,并具有合理的默認值。但同時,它非常強大且可自定義。
這就是為什么,如官方網站所述:
Requests 是有史以來下載次數最多的Python軟件包之一
您的使用方式非常簡單。例如,要發出GET請求,您可以編寫:
response = requests.get(“http://example.com/some/url”)
FastAPI 對應的 API 路徑操作如下所示:
@app.get(“/some/url”)
def read_url():
return {“message”: “Hello World”}
它們使用起來的相似之處如 requests.get(…) 和 @app.get(…)。
啟發 FastAPI 地方:
擁有簡單直觀的API。
直接,直觀地使用HTTP方法名稱(操作)。
具有合理的默認值,功能強大的自定義。
Swagger / OpenAPI
我想要 Django REST Framework 的主要功能是自動 API 文檔。然后我發現 API 文檔有一個標準叫 Swagger ,它使用 JSON 或 YAML 來描述。
并且 Swagger API 的 Web 用戶界面已經被人創建出來了。因此,能夠為 API 生成Swagger 文檔將允許自動使用此 Web 用戶界面。
在某個時候,Swagger 被授予 Linux Foundation,將其重命名為 OpenAPI。這就是為什么在談論版本 2.0 時通常會說“ Swagger”,對于版本3+來說是“ OpenAPI”。
啟發 FastAPI 地方:
為API規范采用開放標準,而不是使用自定義架構。并集成基于標準的用戶界面工具:
Swagger UI
ReDoc
選擇這兩個是因為它們相當受歡迎且穩定,但是通過快速搜索,您可以找到數十個 OpenAPI 的其他替代用戶界面(可以與FastAPI一起使用)。
Flask REST frameworks
有幾個 Flask REST frameworks ,但經過調查和試用,我發現,不少項目都停產或放棄,還存在有一些長期的問題,使得它們并不適合解決前面的問題。
Marshmallow
一個由 API 系統所需的主要功能是數據的序列化,就是把數據從編程語言中的對象轉稱成可以在網絡上傳輸的對象,比如數據庫中的數據轉換為 JSON 對象。將 Python 中的datetime 對象轉為字符串,等等。
另外一個功能就是數據的驗證,確保傳入的參數是有效的,例如,有些字段是一個 int,類型而不是字符串,這在檢測輸入數據是非常有用的。
如果沒有數據驗證,你就必須用手工寫代碼來完成所有的檢查。
這兩點功能就是 Marshmallow 所提供的,這些是一個偉大的圖書館,之前我經常使用它。
Marshmallow 產生之前 Python 還沒有加入類型提示。因此,定義一個 schema 你需要引入 Marshmallow 特定的 utils 的和類。
啟發 FastAPI 地方:
使用代碼來定義提供的數據類型和驗證的 schema,驗證都是自動化的。
FastAPI 使用的框架
Pydantic
Pydantic 是一個庫,基于Python類型提示來定義數據驗證,序列化和文檔(使用JSON模式)。這使其非常直觀。它可與 Marshmallow 媲美。盡管在基準測試中它比Marshmallow 更快。并且由于它基于相同的Python類型提示,因此對編輯器的支持非常棒。
FastAPI 使用它來處理所有數據驗證,數據序列化和自動模型文檔(基于JSON Schema)。
然后,FastAPI 會獲取該 JSON Schema 數據并將其放入OpenAPI 中,除此之外它還會執行其他所有操作。
Starlette
Starlette 是一種輕量級的 ASGI 框架/工具包,是構建高性能 asyncio 服務的理想選擇。
它非常簡單直觀。它的設計易于擴展,并具有模塊化組件。
它具有:
令人印象深刻的性能。
WebSocket支持。
GraphQL支持。
處理中的后臺任務。
啟動和關閉事件。
測試基于 requests 的客戶端。
CORS,GZip,靜態文件,流式響應。
會話和 Cookie 支持。
100% 的測試覆蓋率。
100% 類型注釋的代碼庫。
零硬依賴性。
Starlette 是目前測試最快的 Python 框架。只有 Uvicorn 超越了它,Uvicorn 不是框架,而是服務器。
Starlette 提供了所有基本的 Web 微框架功能。但是它不提供自動數據驗證,序列化或API 文檔。
這是 FastAPI 在頂部添加的主要內容之一,全部基于Python類型提示(使用Pydantic)。以及依賴注入系統,安全實用程序,OpenAPI 模式生成等。
技術細節:ASGI 是 Django 核心團隊成員開發的新“標準”。盡管他們正在這樣做,但它仍然不是“ Python標準”(PEP)。但是,它已經被多種工具用作“標準”。這可以大大提高互操作性,因為您可以將 Uvicorn 切換到任何其他 ASGI 服務器(例如 Daphne 或 Hypercorn),也可以添加與ASGI兼容的工具,例如 python-socketio。
FastAPI 使用它來處理所有核心 Web 部件。在頂部添加功能。類 FastAPI 本身直接繼承Starlette。因此,使用 Starlette 可以執行的任何操作,都可以直接使用 FastAPI 進行。
Uvicorn
Uvicorn 是基于 uvloop 和 httptools 構建的如閃電般快速的 ASGI 服務器。它不是Web框架,而是服務器。例如,它不提供用于按路徑進行路由的工具。那是像 Starlette(或FastAPI)這樣的框架可以提供的。它是 Starlette 和 FastAPI 的推薦服務器。
FastAPI 推薦它為主 Web服務器運行 FastAPI 應用程序。您可以將其與 Gunicorn 結合使用,以擁有異步多進程服務器。在“ 部署” 部分中查看更多詳細信息。
編輯:黃飛
評論
查看更多