Django,F(xiàn)lask ,F(xiàn)astAPI 怎么選?
閱讀大約需要 4.5 分鐘
首先我們達(dá)成一個(gè)共識(shí),框架是用來(lái)幫助我們提升效率,節(jié)省時(shí)間,避免處理那些低級(jí)細(xì)節(jié)的,如果能達(dá)到這個(gè)目標(biāo),就是一個(gè)合適的框架。選擇合適的框架,會(huì)事半功倍。
Python 領(lǐng)域,開(kāi)發(fā) Web 應(yīng)用程序的三個(gè)主流框架是 Django,F(xiàn)lask 和 FastAPI。它們都非常優(yōu)秀,但有各自的特點(diǎn)。本文接下來(lái)闡述每個(gè)框架的優(yōu)缺點(diǎn),以幫助你在使用時(shí)做出最合適的選擇。
Django
Django 是用于構(gòu)建網(wǎng)站的免費(fèi)開(kāi)源 Web 開(kāi)發(fā)框架。它于 2003 年創(chuàng)建,并使用 MTV 模式,也就是 Model-Template-View 模式,如果不使用 Django 的模版語(yǔ)法,也可以認(rèn)為是 MVC 模式,即 Model-View-Controler,對(duì)應(yīng)三個(gè)文件:models.py, views.py, urls.py。
它以其健壯和簡(jiǎn)單的特性而廣受歡迎,地位相當(dāng)于 Java 領(lǐng)域的 Spring,并被 Instagram,Youtube 等技術(shù)巨頭使用,找工作面試,Django 也是重頭戲。Django 非常流行,極客時(shí)間已經(jīng)有專(zhuān)門(mén)的付費(fèi)教程。其次它的設(shè)計(jì)哲學(xué)與 Python 非常搭配,鼓勵(lì)代碼復(fù)用。
優(yōu)點(diǎn)
Django 框架的代碼結(jié)構(gòu)統(tǒng)一且清晰易懂,開(kāi)發(fā)人員可以像做填空題一樣添加更多功能,也可以設(shè)計(jì)自定義的類(lèi)或接口,即簡(jiǎn)單也不失靈活性、擴(kuò)展性。
Django 生態(tài)還有一個(gè)利器就是 Django Rest Framework(DRF),DRF 可以讓你輕松搭建具有 REST 風(fēng)格的 API,由于它具有模塊化和可自定義的架構(gòu),在前后端分離的趨勢(shì)下,使用 Django 構(gòu)建 Web API 也非常容易。
自帶安全性的中間件。Django 通過(guò)提供針對(duì)聯(lián)合 SQL 注入和跨站點(diǎn)請(qǐng)求偽造攻擊的防御來(lái)提供安全性的訪(fǎng)問(wèn)。
Django 生態(tài)非常豐富,第三方類(lèi)適配的類(lèi)庫(kù)也非常多,這意味著遇到問(wèn)題時(shí)你并不孤單。
缺點(diǎn)
Django 可能會(huì)因?yàn)樵S多可重用的模塊而限制了開(kāi)發(fā)速度。它還需要確保以前的版本仍與新版本兼容,從而導(dǎo)致其運(yùn)行稍慢。
Django Models 沒(méi)有 mixins,只有簡(jiǎn)單的繼承。
Django 使用的 ORM 是在 SQLAlchemy 之前創(chuàng)建的,因此 Django ORM 的靈活性較差,因此它不如 SQLAlchemy。
Django 的用例
Django 可以處理任何規(guī)模和容量的項(xiàng)目。我們可以將其用于簡(jiǎn)單站點(diǎn)或高性能站點(diǎn)。一些用例如下:
高負(fù)荷預(yù)訂引擎。 購(gòu)物平臺(tái)。 學(xué)校管理系統(tǒng)。 內(nèi)置用于內(nèi)部數(shù)據(jù)的自定義 CRM 系統(tǒng)。 支持基于 Web 的應(yīng)用程序的 IOS 和 Android 應(yīng)用程序。 管理儀表板,基于照片的驗(yàn)證,用于發(fā)送用戶(hù)通知的電子郵件系統(tǒng)等。
簡(jiǎn)而言之,如果你要做一個(gè)上規(guī)模,不斷擴(kuò)展的,大規(guī)模,商業(yè)化的 Web 項(xiàng)目,Django 是你最好的選擇。
Flask
Flask 是一個(gè)用 Python 編寫(xiě)的微型 Web 框架,可用于開(kāi)發(fā)簡(jiǎn)約的 Web 應(yīng)用程序。Flask 帶有諸如模板引擎,緩存和身份驗(yàn)證之類(lèi)的選項(xiàng)。
它的創(chuàng)建是為了使用 Python 編程語(yǔ)言構(gòu)建 Web 應(yīng)用程序。它被設(shè)計(jì)為易用,快速并且可以擴(kuò)展成為復(fù)雜的應(yīng)用程序或微服務(wù)。
Flask 更像是創(chuàng)作者 Armin Ronacher 在 4 月 1 日對(duì)愚人節(jié)的惡作劇,在其中依賴(lài)了Werkzeug 和 Jinja。令人驚訝的是,它受到了社區(qū)的贊賞,這使他們?cè)诖朔矫孀龅酶唷?/p>
優(yōu)點(diǎn)
與其他 Web 應(yīng)用程序框架不同,flask 讓你可以完全控制 Web 開(kāi)發(fā),從而完全控制應(yīng)用程序和 Web 開(kāi)發(fā)。開(kāi)發(fā)人員有機(jī)會(huì)“坐在駕駛員席上”,掌管你想做的事情,例如添加外部功能。
Flask 允許進(jìn)行單元測(cè)試,并且由于其內(nèi)置的開(kāi)發(fā)服務(wù)器,集成的支持等,因此可以通過(guò)對(duì)一些擴(kuò)展進(jìn)行調(diào)整來(lái)過(guò)渡到 Web 框架。
Flask 簡(jiǎn)單易用,非常適合初學(xué)者使用,為開(kāi)發(fā)人員提供了更好地學(xué)習(xí)和理解它的空間。它還使開(kāi)發(fā)人員可以毫不費(fèi)力地快速創(chuàng)建應(yīng)用程序。
缺點(diǎn)
Flask 的很多模塊由第三方開(kāi)發(fā),容易引起安全漏洞。
Flask 具有一個(gè)單一的來(lái)源,表示它將依次處理每個(gè)請(qǐng)求,因此,無(wú)論有多少個(gè)請(qǐng)求,它仍然會(huì)輪流處理它們,這會(huì)耗費(fèi)更多時(shí)間。
如果開(kāi)發(fā)人員水平不高,更容易使用低質(zhì)量的代碼創(chuàng)建一個(gè)不良的 Web 應(yīng)用程序。
用例
我們可以將 Flask 用于商業(yè)項(xiàng)目。它可以幫助你快速入門(mén),但是網(wǎng)站高負(fù)荷情況下效果不佳。
你可以快速實(shí)施 Flask 項(xiàng)目,例如:
電子商務(wù)系統(tǒng)。 Facebook / Twitter機(jī)器人。 在線(xiàn)社交網(wǎng)絡(luò)。 靜態(tài)網(wǎng)站。
如果你要做一些小型個(gè)人項(xiàng)目,比如聊天機(jī)器人,或者想實(shí)現(xiàn)產(chǎn)品的快速原型,或者喜歡自由的編寫(xiě)代碼控制程序的流程,那么可以選擇 Flask,如果說(shuō) Django 是具備半自動(dòng)駕駛的大型車(chē),那么 Flask 就是讓你自由操縱的手動(dòng)擋小汽車(chē)。
FastAPI
FastAPI 是用于構(gòu)建 Web API 的現(xiàn)代、開(kāi)源、快速、高性能的 Web 框架,它基于Python 3.6+ 標(biāo)準(zhǔn)類(lèi)型提示,支持異步,正如它的名字,F(xiàn)astAPI 就是為構(gòu)建快速的 API 而生。
優(yōu)點(diǎn)
自動(dòng)類(lèi)型檢查。這意味著更少的 Bug,即使在深度嵌套的 JSON 請(qǐng)求中,F(xiàn)ast API 也會(huì)驗(yàn)證開(kāi)發(fā)人員的數(shù)據(jù)類(lèi)型。
集眾所長(zhǎng),站在巨人的肩膀上。FastAPI 建立在 JSON Schema(用于驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)的工具),OAuth 2.0(用于授權(quán)的行業(yè)標(biāo)準(zhǔn)協(xié)議)和OpenAPI(這是可公開(kāi)獲得的應(yīng)用程序編程接口)之類(lèi)的標(biāo)準(zhǔn)之上。
現(xiàn)代化。FastAPI 使使用稱(chēng)為 graphene-python 的 Python 庫(kù)輕松構(gòu)建 GraphQL API 。
快速、高性能。可以和 NodeJS 和 Go 相提并論。
缺點(diǎn)
由于 FastAPI 相對(duì)較新,因此與其他框架相比,社區(qū)較小,第三方的教程相對(duì)較少。
用例
FastAPI 適用于構(gòu)建高性能的 API,本身支持異步,如果要構(gòu)建異步 API,可以?xún)?yōu)先選擇 FastAPI。Netflix 將其用于內(nèi)部危機(jī)管理。它還可以在部署準(zhǔn)備就緒的機(jī)器學(xué)習(xí)模型時(shí)完美縮放,因?yàn)楫?dāng) ML 模型封裝在 REST API 并部署在微服務(wù)中時(shí),它在生產(chǎn)中會(huì)發(fā)揮最佳作用。
比較
我們從軟件包,社區(qū),性能,靈活性,職位空缺和培訓(xùn)來(lái)進(jìn)行比較。
軟件包豐富程度。Django 具有使代碼可重用的大多數(shù)軟件包,是一個(gè)完整的 Web 開(kāi)發(fā)框架,而 Flask 和 FastAPI 是用于構(gòu)建網(wǎng)站的簡(jiǎn)約框架,很多功能比如用戶(hù)系統(tǒng),后臺(tái)管理要自己實(shí)現(xiàn)。
社區(qū)活躍程度。Django 社區(qū)是最活躍的社區(qū),這是因?yàn)樗褂脧V泛,很多大廠(chǎng)使用,另一方面,F(xiàn)lask 的社區(qū)也很繁榮,僅次于 Django。FastAPI 的社區(qū)目前還比較小,因?yàn)樗鄬?duì)較新。
性能。在性能方面,F(xiàn)astAPI 是領(lǐng)跑者,因?yàn)樗敲嫦蛩俣鹊模浯问?Flask,最后是 Django。
靈活性。靈活性是開(kāi)發(fā)人員非常重視的東西,并且 Flask 比 Django 更靈活。另一方面,F(xiàn)astAPI 在代碼方面是靈活的,并且不限制代碼布局。因此,我們可以說(shuō) Flask 在這三者中是最靈活的。
職位空缺。毫無(wú)疑問(wèn),Python 網(wǎng)絡(luò)生態(tài)系統(tǒng)中有 Django 要求的職位空缺更多,其次是 Flask,最后是 FastAPI,其數(shù)量要少得多,因此,如果你打算快速找到工作,那么 Django 應(yīng)該是你的首選。
學(xué)習(xí)成本。FastAPI < Flask < Django。Django 雖然學(xué)習(xí)起來(lái)比較費(fèi)勁,但是有完善的官方文檔和很多在線(xiàn)資料和資源。Flask 既簡(jiǎn)單又直接,也有豐富的在線(xiàn)資料和資源。而 FastAPI 學(xué)習(xí)起來(lái)更簡(jiǎn)單直接,不過(guò)資源相對(duì)較少,因?yàn)檫€需要時(shí)間。
最后的話(huà)
仔細(xì)比較之后,你也許可以選擇最適合你的那一個(gè)。總而言之,如果你想構(gòu)建健壯的全棧式網(wǎng)站,那么 Django 是完美的選擇,因?yàn)樗哂卸喾N功能并且在生產(chǎn)中運(yùn)行良好。
對(duì)于需要快速原型化 Web 應(yīng)用程序并輕松快速地構(gòu)建 API 的機(jī)器學(xué)習(xí)工程師或開(kāi)發(fā)人員而言,F(xiàn)lask 是理想的選擇。
如果你正在尋找速度或可伸縮性,F(xiàn)astAPI 是完美的選擇。根據(jù)你要使用的框架來(lái)選擇框架始終是明智的選擇。
但是總的來(lái)說(shuō),它們都很好并且有很好的市場(chǎng)需求。
如果覺(jué)得不錯(cuò),請(qǐng)點(diǎn)贊、分享、關(guān)注「Python七號(hào)」,學(xué)習(xí)更多 Python 技術(shù)。
