搜尋
首頁後端開發Python教學燒瓶死了嗎? FastAPI 是未來嗎?

Is Flask Dead? Is FastAPI the Future?
在我的相關搜尋中,我注意到即使到了 2024 年,仍有相當多的人推薦 Flask 作為 Python Web 框架。不過,在我看來,「Flask 正在走向淘汰,FastAPI 代表著未來」。這就是我寫這篇文章的原因。歡迎大家參與討論,提出反駁。

Flask 與 FastAPI

Flask 在 Python 開發者心中佔有重要地位。如果您是 Web 開發人員,我敢打賭您很可能使用過 Flask,但也許您從未涉足過 FastAPI。

這裡有兩個證據:

  1. 在近一兩年新出現的與Web開發相關的Python新專案中​​,幾乎所有涉及Web開發的專案都採用了FastAPI。
  2. 截至2024年12月25日,在GitHub上,FastAPI的star數(78.9k)已超過Flask(68.4k)。

現在我們來看看官方Python開發者調查中Web框架佔比的變化。

很明顯,2019 年 FastAPI 甚至沒有被列為選項,但到 2023 年,其份額已達到 25%。 (目前,我們只有 2023 年之前的數據。)

要注意的是,這個比例資料涵蓋了現有系統,因此Django和Flask的比例不會快速下降。儘管如此,趨勢還是很明顯的。

我們都知道,Web 框架領域非常豐富,幾乎每年都會出現新的框架。這些框架大多數都是短暫的,但也有一些能夠持久存在。 FastAPI誕生於2018年底,2019年底左右開始嶄露頭角。那麼,它如何在短短五年內超越2010年底誕生的Flask呢?接下來,讓我們沿著時間軸追溯Python Web框架和相關解決方案的發展歷史,以便更好地理解。

Web 框架(外掛程式、工具)的演變

FastAPI的作者是一位極為關注Python生態發展的開發者。擴展閱讀連結2是作者寫的《Alternatives, Inspiration and Comparisons》(https://fastapi.tiangolo.com/alternatives/),詳細闡述了FastAPI從各個庫中汲取的參考或啟發。本文的發展歷史部分也參考了這篇文章。我建議閱讀原文,因為它包含了FastAPI出現的原理以及作者的一些設計理念。

燒瓶

Flask 是一個「微型」框架,與 Django 有著天壤之別。它只保留了少數核心功能,為了解耦,將其他功能拆分成幾個函式庫(例如 Jinja2、Werkzeug 等)。這給了開發者足夠的自由,使他們能夠毫不費力地為相關功能編寫第三方外掛程式。它的內部設計,如藍圖、上下文和用於表示路線、信號等的裝飾器,在當時是相當先進的。再加上全面的文檔,它對新手來說非常友好。

Flask REST 框架

由於其簡單性,Flask 非常適合建立 API。然而,由於Flask本身沒有任何內建功能,因此我們需要專門的REST框架。於是,flask-restful、Flask-RESTPlus、flask-api等框架相繼出現。此外,在 REST 服務中,存在資料驗證、解析和規範的需求,這導致了 Marshmallow、Webargs 和 APISpec 的出現,直到 Flask-apispec 出現。然而,在整個開發過程中,與 DRF 相媲美的 Flask REST 框架從未實現。

現階段,Flask的缺點逐漸凸顯出來。

Flask 最初的優勢在於其靈活性和極簡性,但這也意味著需要內部開發大量組件。這要么需要一家擁有專門開發人員進行開發和維護的大公司,要么需要非常有能力的個人開發人員。否則,插件很難達到生產質量,導致 Flask 第三方插件魚龍混雜,無法保證長期維護。如前所述,其中許多庫已經停止維護。

所以,即使在今天,如果你想用 Flask 建立一個 API 服務,你仍然需要拼湊各種元件。對於一些沒有及時更新的組件,需要您自行排查。老手也許能夠應付,但對於初學者來說,這相當令人畏懼,尤其是當他們想要應用最新的實踐和概念時。

Asyncio 生態系統

從Python 3.5開始,asyncio已經成為未來的趨勢。於是,出現了一些原生支援 asyncio 的 Web 框架,例如 aiohttp、Starlette、sanic。

這時候,Flask 就不太適應了。社區添加對 asyncio 的支持進展緩慢,Flask 的原作者已經轉而編寫 Rust,將項目留給了兩名維護者(現在只剩下一名維護者)。

apistar、melt等建置API服務的專案都為FastAPI的誕生提供了設計靈感。

快速API

然後,FastAPI 誕生了。作者原本是在尋求一個好的解決方案,但上述情況各有各的問題或限制。於是,作者創造了這個新的框架。

為什麼 FastAPI 脫穎而出

這是文章的核心部分。以下原因正是FastAPI能夠取代Flask的原因。

使用 Pydantic 驗證用戶數據

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 無疑是最佳選擇。

對 ASGI 的本機支持

我們先提一下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 應用程式。

在下結論之前,我們先補充五個術語解釋:

  1. ASGI Toolkit:實作ASGI相關功能的函式庫(如URL路由、Request/Response物件、模板引擎等)。本文主要指的是Starlette,它對應的是Flask的依賴Werkzeug。
  2. ASGI Web 框架:實作 ASGI 規範的 Web 框架(如 FastAPI),而 Flask 和 Django 是實作 WSGI 的 Web 框架。這些框架專為開發人員編寫應用程式而設計,具有易於使用的介面。開發者只需要根據自己的需求填寫業務邏輯。早期的框架大多在內部實現ASGI工具包,而後來的框架通常會結合合適的工具包。例如,Flask 使用 Werkzeug(自己的),FastAPI 使用 Starlette(其他人的)。
  3. Web應用程式:使用Web框架創建的應用程式就是Web應用程式。通常,Web 框架附帶一個測試伺服器,可以啟動該伺服器進行開發和調試。如果你不關心效能和穩定性的話,你已經可以在瀏覽器中存取開發地址來存取這個應用程式了。
  4. Web 伺服器:現實世界比想像的更複雜。 Web應用部署到生產環境後,需要考慮請求負載平衡、靜態檔案服務、存取控制、反向代理程式等需求,同時對效能也有很高的要求。 Web框架內建的Web伺服器根本無法滿足這些要求,因此需要專門的Web伺服器。目前Nginx是主流選擇。
  5. ASGI 伺服器:ASGI 伺服器可作為 Web 伺服器和 Web 應用程式之間的橋樑。 ASGI伺服器也遵循ASGI規範,但其主要任務是滿足轉送請求的效能要求,因此它主要照顧ASGI的「G」(網關)部分。其程式碼對於開發者編寫Web應用業務和路由邏輯並不友善。目前,最知名的ASGI伺服器是Uvicorn,原本來自WSGI伺服器Gunicorn的uvicorn.workers.UvicornWorker也是一個選擇。這些是生產環境中的建議用法。

以前WSGI的生產環境解決方案通常是Nginx Gunicorn Flask(Django),而現在ASGI的生產環境解決方案是Nginx Uvicorn FastAPI。

還有一件事。從FastAPI的名稱和介紹來看,很明顯地它是為了建構API服務而設計的。其實它的核心程式碼就是這樣的。可以說,它不是一個傳統的、完全自行實現的框架,而更多的是一個結合了各種框架優點的框架。它從一個空殼開始,組裝必要且合適的組件。例如,它沒有模板引擎。如果你確實需要用它來建立需要模板渲染的網路應用程序,你可以選擇並組合你需要的模板引擎。當然,你也可以使用Starlette內建的Jinja2(是的,Flask也內建了)。

為什麼 Flask 已死

上述FastAPI的優點並不足以斷定Flask已死。那麼,我為什麼要持有這樣的觀點呢?主要取決於開發者和使用者的受歡迎程度。

這裡的「受歡迎程度」是相當主觀的。我能想到的指標如下:

  1. 社區活動(https://github.com/pallets/flask/issues):以專案的 issues 和 pull requests 數量為例。 Flask 只有個位數,這與 FastAPI 完全不同。這其實從側面反映出該項目已經不再活躍了。如果專案活躍的話,老用戶會有更多的需求。如果他們停止提出問題,就意味著他們已經離開了。而新用戶肯定會遇到各種各樣的問題。即使有詳細的文檔,仍然應該有很多用戶來提問和貢獻程式碼。沒有這種情況表示使用者較少。
  2. 討論熱度:即部落格文章、Stack Overflow 等網站上的查詢和討論的熱度。很明顯,現在寫 Flask 的人很少了。
  3. 開發迭代頻率(https://github.com/pallets/flask/pulls):從commit記錄可以看出,Flask只有一名維護者,偶爾修復一些bug,沒有什麼主要功能發展。
  4. 關鍵人物的影響力:Flask背後的關鍵人物,專案發起人,早已不再參與此專案。根據專案貢獻記錄,Armin Ronacher 上次為該開發做出貢獻是在六年前。

在我看來,所有這些情況都表明 Flask 的鼎盛時期已經過去,FastAPI 是後起之秀。

最後介紹一下部署Flask/FastAPI的理想平台:Leapcell。

Leapcell是專為現代分散式應用程式設計的雲端運算平台。其按需付費的定價模式確保沒有閒置成本,這意味著用戶只需為他們實際使用的資源付費。

Is Flask Dead? Is FastAPI the Future?

Leapcell對於WSGI/ASGI應用的獨特優點:

1. 多語言支持

  • 支援 JavaScript、Python、Go 或 Rust 開發。

2. 無限項目免費部署

  • 僅依使用情況收費。沒有要求時不收費。

3. 無與倫比的成本效益

  • 即用即付,無閒置費用。
  • 例如,25 美元可以支援 694 萬個請求,平均回應時間為 60 毫秒。

4.簡化的開發者體驗

  • 直覺的使用者介面,易於設定。
  • 完全自動化的 CI/CD 管道和 GitOps 整合。
  • 即時指標和日誌,提供可操作的見解。

5. 輕鬆的可擴充性和高效能

  • 自動伸縮,輕鬆應付高併發。
  • 零營運開銷,讓開發者專注於開發。

在文件中了解更多!

Leapcell Twitter:https://x.com/LeapcellHQ

以上是燒瓶死了嗎? FastAPI 是未來嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
為什麼數組通常比存儲數值數據列表更高?為什麼數組通常比存儲數值數據列表更高?May 05, 2025 am 12:15 AM

ArraySareAryallyMoremory-Moremory-forigationDataDatueTotheIrfixed-SizenatureAntatureAntatureAndirectMemoryAccess.1)arraysStorelelementsInAcontiguxufulock,ReducingOveringOverheadHeadefromenterSormetormetAdata.2)列表,通常

如何將Python列表轉換為Python陣列?如何將Python列表轉換為Python陣列?May 05, 2025 am 12:10 AM

ToconvertaPythonlisttoanarray,usethearraymodule:1)Importthearraymodule,2)Createalist,3)Usearray(typecode,list)toconvertit,specifyingthetypecodelike'i'forintegers.Thisconversionoptimizesmemoryusageforhomogeneousdata,enhancingperformanceinnumericalcomp

您可以將不同的數據類型存儲在同一Python列表中嗎?舉一個例子。您可以將不同的數據類型存儲在同一Python列表中嗎?舉一個例子。May 05, 2025 am 12:10 AM

Python列表可以存儲不同類型的數據。示例列表包含整數、字符串、浮點數、布爾值、嵌套列表和字典。列表的靈活性在數據處理和原型設計中很有價值,但需謹慎使用以確保代碼的可讀性和可維護性。

Python中的數組和列表之間有什麼區別?Python中的數組和列表之間有什麼區別?May 05, 2025 am 12:06 AM

Pythondoesnothavebuilt-inarrays;usethearraymoduleformemory-efficienthomogeneousdatastorage,whilelistsareversatileformixeddatatypes.Arraysareefficientforlargedatasetsofthesametype,whereaslistsofferflexibilityandareeasiertouseformixedorsmallerdatasets.

通常使用哪種模塊在Python中創建數組?通常使用哪種模塊在Python中創建數組?May 05, 2025 am 12:02 AM

theSostCommonlyusedModuleForCreatingArraysInpyThonisnumpy.1)NumpyProvidEseffitedToolsForarrayOperations,Idealfornumericaldata.2)arraysCanbeCreatedDusingsnp.Array()for1dand2Structures.3)

您如何將元素附加到Python列表中?您如何將元素附加到Python列表中?May 04, 2025 am 12:17 AM

toAppendElementStoApythonList,usetheappend()方法forsingleements,Extend()formultiplelements,andinsert()forspecificpositions.1)useeAppend()foraddingoneOnelementAttheend.2)useextendTheEnd.2)useextendexendExendEnd(

您如何創建Python列表?舉一個例子。您如何創建Python列表?舉一個例子。May 04, 2025 am 12:16 AM

TocreateaPythonlist,usesquarebrackets[]andseparateitemswithcommas.1)Listsaredynamicandcanholdmixeddatatypes.2)Useappend(),remove(),andslicingformanipulation.3)Listcomprehensionsareefficientforcreatinglists.4)Becautiouswithlistreferences;usecopy()orsl

討論有效存儲和數值數據的處理至關重要的實際用例。討論有效存儲和數值數據的處理至關重要的實際用例。May 04, 2025 am 12:11 AM

金融、科研、医疗和AI等领域中,高效存储和处理数值数据至关重要。1)在金融中,使用内存映射文件和NumPy库可显著提升数据处理速度。2)科研领域,HDF5文件优化数据存储和检索。3)医疗中,数据库优化技术如索引和分区提高数据查询性能。4)AI中,数据分片和分布式训练加速模型训练。通过选择适当的工具和技术,并权衡存储与处理速度之间的trade-off,可以显著提升系统性能和可扩展性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具