FastAPI框架诞生的缘由(上)
閱讀本文大概需要 3.6 分鐘。
原文:https://fastapi.tiangolo.com/alternatives/
作者:tiangolo,FastAPI 的創作者,github star 10.1k
翻譯:somenzz
侵刪
?
本文講述了什么啟發了 FastAPI 的誕生,它與其他替代框架的對比,以及從中汲取的經驗。
簡介:
如果不是基于前人的成果,FastAPI 將不會存在。在 FastAPI 之前,前人已經創建了許多工具 。
?
幾年來,我一直在避免創建新框架。首先,我嘗試使用許多不同的框架,插件和工具來解決 FastAPI 涵蓋的所有功能。
?
但是有時候,沒有更好的辦法,除了創建具有所有這些功能的東西,從以前的工具中汲取最佳創意,并以最佳方式將它們組合起來,使用以前甚至沒有的語言功能(Python 3.6+類型提示)。
在此之前的一些框架:
Django
Django 是最流行的 Python 框架,受到廣泛信任。它用于構建 Instagram 之類的系統。
它與關系數據庫(例如 MySQL 或 PostgreSQL)相對緊密地結合在一起,因此,以NoSQL 數據庫(例如 Couchbase,MongoDB,Cassandra 等)作為 django 的主存儲引擎并不是一件容易的事。
?
創建它是為了在后端生成 HTML,而不是創建現代前端(例如 React,Vue.js 和Angular)或與其通信的其他系統(例如 IoT 設備)使用的API 。
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,驗證都是自動化的。
Webargs
API 框架需要的另一大功能點是解析從前端發送的請求數據。Webargs (包括Flask) 是提供這一功能的工具,它采用 Marshmallow 做數據驗證。Webargs 和 Marshmallow ?的作者是同一個開發人員。這是一個偉大的工具,在 FastAPI 誕生之前,我一直在用它。
?
啟發 FastAPI 地方:
對輸入的請求數據的自動驗證。
(未完待續)
總結
以上是生活随笔為你收集整理的FastAPI框架诞生的缘由(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringDay3
- 下一篇: 死锁的概念以及发生死锁的缘由