FastAPI or Flask?從使用者出發,才是王道

語言: CN / TW / HK

✏️ 編者按: 前段時間,Milvus demo 使用的服務框架從 Flask 切換為 FastAPI,這一改動引發了社群小夥伴們討論:為什麼要改服務框架?改了以後有什麼好處?為了解答社群小夥伴們的疑問,Zilliz 資料工程師雲梅寫下這篇文章。 加入 Zilliz 以來,雲梅致力於為開源向量資料庫 Milvus 探索解決方案,幫助使用者打造場景應用。她深入關注自然語言處理技術和搜尋推薦系統,日常喜歡一個人貓著亂翻書。 如果你也想參與討論,歡迎加入我們的技術交流群,加群方式請見文末 🤩

概述

為了讓使用者輕鬆上手向量資料庫 Milvus,我們在 GitHub 上開源了 Milvus Bootcamp 專案。該專案除了提供測試效能的指令碼和資料外,還提供了一些使用 Milvus 資料庫實現的小專案,比如以圖搜圖、視訊分析、自動問答機器人、推薦系統等。這些專案不僅生動地展示了向量資料庫 Milvus 的應用場景,還可以幫你在實際專案中真實體驗向量資料庫 Milvus 有多好用。

倉庫地址:http://github.com/milvus-io/bootcamp

在這些專案中,我們提供了前端和後端服務。起初,這些專案的後端使用了 Web 框架 Flask 來提供 Web 服務,後來採用 FastAPI 替換了 Flask。切換之後,社群的一些小夥伴提出了疑問,為什麼我們最終選擇使用 FastAPI 而不是 Flask?我們在社群內進行了一些很有價值的討論,這篇文章將系統地講述這一切換的目的。 讓我們來先看一下什麼是 Web 框架,以及 Flask 和 FastAPI 各自有什麼特點。

Python web

Web 框架是一組包或模組的集合,是用於進行 Web 開發的一套軟體架構,允許開發人員編寫 Web 應用程式或服務,而無需處理諸如協議、套接字或程序/執行緒管理之類的低階細節,減少了開發人員開發 Web 應用的工作量。使用 Web 框架進行 Web 開發的時候,在進行資料快取、資料庫訪問、資料安全校驗等方面,不需要自己再重新實現,而是將業務邏輯相關的程式碼寫入框架就可以。 目前已有很多 Python web 框架,其中常見的如 Django、Flask、Tornado、FastAPI 等。本文將基於 Milvus Bootcamp 中的實際應用,聚焦 Flask 和 FastAPI 並討論兩者的不同,以及我們選擇 FastAPI 的原因。

Flask

Flask 是一個基於 Python 的輕量級 Web 應用框架。Flask 框架核心簡單,使用者可以輕鬆地開發自己的 Web 應用。此外,Flask 有一個簡單且易於擴充套件的核心,使用者在使用 Flask 開發網站時,可以根據自己的需求新增不同的功能,各種外掛庫可以讓使用者完全按照自己的意願開發出功能強大的網站。 Flask 具有以下特點:

  • Flask 是一個微框架,因為它不需要特定的工具或庫。它沒有資料庫抽象層、表單驗證或任何其他預先存在的第三方庫提供通用功能的元件。但是,Flask 支援可以新增應用程式功能的擴充套件,就好像它們是在 Flask 本身中實現的一樣。存在物件關係對映器、表單驗證、上傳處理、各種開放身份驗證技術和一些常見框架相關工具的擴充套件。

  • Flask 是一個基於 WSGI(Web Server Gateway Interface)的 Web 應用框架。WSGI 是為 Python 語言定義的 Web 伺服器和 Web 應用程式或框架之間的一種簡單而通用的介面。

  • Flask 包含了 Werkzeug 和 Jinja2 兩個核心函式庫。Werkzeug 是一個 WSGI 工具包,它實現了請求、響應物件和實用功能,這使得使用者可以在其上構建 Web 框架,Flask 框架使用 Werkzeg 作為其基礎之一;Jinja2 是一個流行的 Python 的功能齊全的模板引擎,它有完整的 unicode 支援,一個可選的整合沙箱執行環境,被廣泛使用。

FastAPI

FastAPI 是一個現代化的高效能 Python Web 應用框架,具有與 Go 和 NodeJS 一樣高的效能。FastAPI 核心建立在 Starlette 和 Pydantic 基礎之上。Starlette 是一種輕量級的 ASGI 框架的工具包,是構建高效能 Asyncio 服務的選擇;Pydantic 是一個基於 Python 型別提示來定義資料驗證、序列化和文件的庫。 FastAPI 具有以下特點:

  • FastAPI 是一個基於 ASGI(Asynchronous Server Gateway Interface)的 Web 應用框架。ASGI 是非同步閘道器協議介面,一個介於網路協議服務和 Python 應用之間的標準介面,能夠處理多種通用的協議型別,包括 HTTP、HTTP2 和 WebSocket。
  • FastAPI 基於的 Pydantic 提供了介面資料型別檢查的功能。使用者不需要做額外的介面引數校驗,不用寫大量程式碼驗證引數是否為空、型別是否正確,有效減少了程式碼中的人為錯誤,提高開發效率。
  • FastAPI 支援 OpenAPI(前身是 Swagger)和 Redoc 兩種文件格式。對於使用者來說,不用花費大量時間寫額外的介面文件。FastAPI 提供的 OpenAPI 文件如圖:

Why FastAPI

在為 Milvus Bootcamp 中的專案選擇 Web 應用框架時,我們調研了包括 Django、Flask、FastAPI、Tornado 等在內的多種 Python Web 應用框架。由於 Milvus Bootcamp 中的專案是作為案例提供給 Milvus 使用者參考的,那我們首先考慮的點就是,依賴的外部框架應該儘可能輕量、簡單易上手,因此初步篩選出了 Flask 和 FastAPI。 接著,讓我們深入調研 Flask 和 FastAPI,我這裡對兩者之間的比較做了一個簡單的總結:

網上比較 Flask 和 FastAPI 這兩個 Web 應用框架的文章非常多,大多基於以上表格中的這幾點進行比較。這裡,我將基於 Milvus Bootcamp 中的專案和實際應用來分析選擇了使用 FastAPI 而不是 Flask 的原因。

  • 一是基於效能的考慮。對於以圖搜圖、問答系統、相似文字檢索等專案來說,這些系統的實時性要求都相對較高。因此在選擇 Web 框架時,效能是我們考慮的一個重點。眾所周知,高效能是 FastAPI 的一大亮點。

  • 二是基於開發效率的考慮。FastAPI 提供了自動驗證資料型別的功能,可以有效減少開發時人為的程式碼錯誤,極大提高開發效率。而對於 Flask 來說,每一個介面都需要在程式碼中完成資料型別的驗證,判斷傳入的資料是否為空等,增加了專案中的程式碼量。Bootcamp 是面向使用者的一個 Milvus 訓練營,簡單易上手的程式碼和較低的出錯率,能極大地優化使用者的使用感。

  • 三是基於 FastAPI 原生支援非同步的考慮。此前, Milvus 官網上線了可供使用者自行上傳資料並查詢的以圖搜圖、視訊分析、問答機器人和化學式檢索這四個專案。使用者上傳資料時,由於對視訊和文字等資料的處理過程相對耗時,所以我們選擇了在服務端接受到使用者請求時就立刻給使用者返回 ✅「已接收到請求」的訊息,等後臺服務處理完資料後,再給使用者傳送一個 ✅✅「資料上傳成功」的提示。由於 FastAPI 本身支援非同步的特性,這一點實現起來也非常容易。

  • 四是 FastAPI 提供了自動互動式文件。無論是在開發過程中除錯程式碼介面,還是在和前端團隊開發 Web 前端時的對接過程中,我們都可以直接開啟 FastAPI 提供的 OpenAPI 文件進行除錯。而如果使用其他不提供這類文件的 Web 框架,那麼在完成 Web 服務端程式碼開發後,我們還需要寫一個介面文件,額外使用 Postman 一類的工具除錯介面。此外,對於使用者來說,如果只想啟動 Bootcamp 中提供的專案的 Web 服務端,而不想額外的啟動一個 Web 網頁端服務,只需要開啟 FastAPI 提供的 OpenAPI 文件,也能以一個直觀的方式去體驗這些專案。

  • 最後,我們考慮的是兩個框架對使用者友好程度的不同。FastAPI 的開發和使用更加簡單,使得 Milvus 資料庫的使用者在學習瞭解 Milvus Bootcamp 中的專案時,可以更多地關注專案本身的具體實現,而不用花費過多的時間去學習依賴的 Web 框架等。

總結

Flask 和 FlastAPI 各有其突出的特點。FlastAPI 作為一個相對比較新的 Web 應用框架,其核心依賴 Starlette 和 Pydantic,可謂是一個站在巨人肩膀上的產物,其高效能、非同步框架、資料驗證等特點非常吸引開發者。Flask 是一個早期的 Web 框架,在基礎功能之上還支援靈活地新增各種外掛,具備完善的功能,也有完善的官方文件和大量使用者釋出的使用經驗,以及活躍的使用者社群。總體而言,在實際應用過程中,開發者應該基於實際應用需求去選擇合適的框架。


Zilliz 以重新定義資料科學為願景,致力於打造一家全球領先的開源技術創新公司,並通過開源和雲原生解決方案為企業解鎖非結構化資料的隱藏價值。 Zilliz 構建了 Milvus 向量資料庫,以加快下一代資料平臺的發展。Milvus 資料庫是 LF AI & Data 基金會的畢業專案,能夠管理大量非結構化資料集,在新葯發現、推薦系統、聊天機器人等方面具有廣泛的應用。