在我的相關搜尋中,我注意到即使到了 2024 年,仍有相當多的人推薦 Flask 作為 Python Web 框架。不過,在我看來,「Flask 正在走向淘汰,FastAPI 代表著未來」。這就是我寫這篇文章的原因。歡迎大家參與討論,提出反駁。
Flask 在 Python 開發者心中佔有重要地位。如果您是 Web 開發人員,我敢打賭您很可能使用過 Flask,但也許您從未涉足過 FastAPI。
這裡有兩個證據:
現在我們來看看官方Python開發者調查中Web框架佔比的變化。
很明顯,2019 年 FastAPI 甚至沒有被列為選項,但到 2023 年,其份額已達到 25%。 (目前,我們只有 2023 年之前的數據。)
要注意的是,這個比例資料涵蓋了現有系統,因此Django和Flask的比例不會快速下降。儘管如此,趨勢還是很明顯的。
我們都知道,Web 框架領域非常豐富,幾乎每年都會出現新的框架。這些框架大多數都是短暫的,但也有一些能夠持久存在。 FastAPI誕生於2018年底,2019年底左右開始嶄露頭角。那麼,它如何在短短五年內超越2010年底誕生的Flask呢?接下來,讓我們沿著時間軸追溯Python Web框架和相關解決方案的發展歷史,以便更好地理解。
FastAPI的作者是一位極為關注Python生態發展的開發者。擴展閱讀連結2是作者寫的《Alternatives, Inspiration and Comparisons》(https://fastapi.tiangolo.com/alternatives/),詳細闡述了FastAPI從各個庫中汲取的參考或啟發。本文的發展歷史部分也參考了這篇文章。我建議閱讀原文,因為它包含了FastAPI出現的原理以及作者的一些設計理念。
Flask 是一個「微型」框架,與 Django 有著天壤之別。它只保留了少數核心功能,為了解耦,將其他功能拆分成幾個函式庫(例如 Jinja2、Werkzeug 等)。這給了開發者足夠的自由,使他們能夠毫不費力地為相關功能編寫第三方外掛程式。它的內部設計,如藍圖、上下文和用於表示路線、信號等的裝飾器,在當時是相當先進的。再加上全面的文檔,它對新手來說非常友好。
由於其簡單性,Flask 非常適合建立 API。然而,由於Flask本身沒有任何內建功能,因此我們需要專門的REST框架。於是,flask-restful、Flask-RESTPlus、flask-api等框架相繼出現。此外,在 REST 服務中,存在資料驗證、解析和規範的需求,這導致了 Marshmallow、Webargs 和 APISpec 的出現,直到 Flask-apispec 出現。然而,在整個開發過程中,與 DRF 相媲美的 Flask REST 框架從未實現。
現階段,Flask的缺點逐漸凸顯出來。
Flask 最初的優勢在於其靈活性和極簡性,但這也意味著需要內部開發大量組件。這要么需要一家擁有專門開發人員進行開發和維護的大公司,要么需要非常有能力的個人開發人員。否則,插件很難達到生產質量,導致 Flask 第三方插件魚龍混雜,無法保證長期維護。如前所述,其中許多庫已經停止維護。
所以,即使在今天,如果你想用 Flask 建立一個 API 服務,你仍然需要拼湊各種元件。對於一些沒有及時更新的組件,需要您自行排查。老手也許能夠應付,但對於初學者來說,這相當令人畏懼,尤其是當他們想要應用最新的實踐和概念時。
從Python 3.5開始,asyncio已經成為未來的趨勢。於是,出現了一些原生支援 asyncio 的 Web 框架,例如 aiohttp、Starlette、sanic。
這時候,Flask 就不太適應了。社區添加對 asyncio 的支持進展緩慢,Flask 的原作者已經轉而編寫 Rust,將項目留給了兩名維護者(現在只剩下一名維護者)。
apistar、melt等建置API服務的專案都為FastAPI的誕生提供了設計靈感。
然後,FastAPI 誕生了。作者原本是在尋求一個好的解決方案,但上述情況各有各的問題或限制。於是,作者創造了這個新的框架。
這是文章的核心部分。以下原因正是FastAPI能夠取代Flask的原因。
API開發過程中,資料格式驗證、解析、序列化是常規操作。多年來,出現了多種解決方案,目前 Pydantic 是首選:
乍一看,這段程式碼看起來像是ORM或資料類別的編寫方式,但實際上,它使用Python原生的Type Hints語法來註解欄位類型。例如,在上面的範例中,/items/請求中的Item的schema已經被明確定義,每個欄位的值類型都是明確的。相較於舊有的使用 schema 描述甚至硬編碼的方式,這種方式更加簡潔,更符合 Python 風格,並且有更好的 IDE 支援。
目前,Pydantic 在用戶資料驗證領域佔據主導地位。由於 FastAPI 內建了它,因此大大簡化了驗證過程,並減少了錯誤。這就是為什麼FastAPI官網提到解決方案可以減少開發者高達40%的錯誤。對於像Python這樣的動態語言,如果不使用mypy進行類型檢查,應用Pydantic是必不可少的。
此外,由於 Pydantic 的集成,向專案添加 ORM(例如 SQLAlchemy)變得非常容易。從請求中獲得的物件可以直接傳遞到資料庫,因為資料驗證已經完成。反之亦然,從資料庫檢索到的物件也可以直接回傳。
相較之下,Flask 在這方面有所欠缺。
Flask 時代,程式碼執行是單執行緒、同步的。這意味著必須逐一處理請求,而其他請求會在前一個請求完成之前浪費時間等待 I/O 操作。另一方面,Asyncio 是最佳解決方案。它可以使 I/O 操作非同步,讓您無需等待任務完成即可取得任務結果,然後繼續處理其他任務請求。
FastAPI 原生支援並發和非同步程式碼。只要程式碼寫得正確,就可以達到最高效率。因此,它被認為是目前最快的Python框架,其效率與NodeJS或Go類似。當速度和效能至關重要時,FastAPI 無疑是最佳選擇。
我們先提一下WSGI。它的全名為“Python Web Server Gateway Interface”,可參考“PEP 3333”(https://peps.python.org/pep-3333/)。它是專門為 Web 應用程式和伺服器之間的互動編寫的 Python 標準。如果您使用過 PHP 或 Ruby,您可能會發現它更容易理解。 Flask 依賴 Werkzeug,它是一個 WSGI 套件,因此 Flask 支援這個舊的 WSGI 標準,而不是 ASGI。
WSGI 的問題在於它無法利用非同步來提高效能和效率。所以,Django通道開創了ASGI。它的全名是“非同步伺服器網關介面”,這是一個迭代的、幾乎完全重新設計的標準。它提供非同步伺服器/應用程式介面並支援 HTTP、HTTP/2 和 WebSocket。與 WSGI 不同,ASGI 允許每個應用程式有多個非同步事件。此外,ASGI 支援同步和非同步應用程式。您可以將舊的同步 WSGI Web 應用程式移轉到 ASGI,也可以使用 ASGI 建立新的非同步 Web 應用程式。
在下結論之前,我們先補充五個術語解釋:
以前WSGI的生產環境解決方案通常是Nginx Gunicorn Flask(Django),而現在ASGI的生產環境解決方案是Nginx Uvicorn FastAPI。
還有一件事。從FastAPI的名稱和介紹來看,很明顯地它是為了建構API服務而設計的。其實它的核心程式碼就是這樣的。可以說,它不是一個傳統的、完全自行實現的框架,而更多的是一個結合了各種框架優點的框架。它從一個空殼開始,組裝必要且合適的組件。例如,它沒有模板引擎。如果你確實需要用它來建立需要模板渲染的網路應用程序,你可以選擇並組合你需要的模板引擎。當然,你也可以使用Starlette內建的Jinja2(是的,Flask也內建了)。
上述FastAPI的優點並不足以斷定Flask已死。那麼,我為什麼要持有這樣的觀點呢?主要取決於開發者和使用者的受歡迎程度。
這裡的「受歡迎程度」是相當主觀的。我能想到的指標如下:
在我看來,所有這些情況都表明 Flask 的鼎盛時期已經過去,FastAPI 是後起之秀。
最後介紹一下部署Flask/FastAPI的理想平台:Leapcell。
Leapcell是專為現代分散式應用程式設計的雲端運算平台。其按需付費的定價模式確保沒有閒置成本,這意味著用戶只需為他們實際使用的資源付費。
Leapcell對於WSGI/ASGI應用的獨特優點:
在文件中了解更多!
Leapcell Twitter:https://x.com/LeapcellHQ
以上是燒瓶死了嗎? FastAPI 是未來嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!