新聞中心
Python程序員有很多很好的選擇來(lái)創(chuàng)建Web應(yīng)用程序和API;Django,Weppy,Bottle和Flask引領(lǐng)潮流。

創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元新津縣做網(wǎng)站,已為上家服務(wù),為新津縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
如果正在開(kāi)發(fā)一個(gè)Web應(yīng)用程序并且已經(jīng)選擇使用Python作為構(gòu)建它的語(yǔ)言,那么這是一個(gè)明智的選擇。Python的開(kāi)發(fā)成熟度,強(qiáng)大的庫(kù)以及廣泛的實(shí)際應(yīng)用使其成為Web開(kāi)發(fā)的必需。
現(xiàn)在是困難的部分:從眾多可用的Python web框架中選擇一個(gè)。它們不僅數(shù)量在不斷增長(zhǎng),而且很難找到最適合你的。如果你正在構(gòu)建一個(gè)快速而又簡(jiǎn)單的REST API,那么你將不需要任何完整的面向用戶的應(yīng)用程序所需的管道和連接,該應(yīng)用程序具有用戶登錄、表單驗(yàn)證和上傳處理就可以了。
在本文中,我們將研究13種最廣泛部署的Python web框架。我們將關(guān)注每種web應(yīng)用程序最適合構(gòu)建哪種類(lèi)型的web應(yīng)用程序,并研究它們?nèi)绾卧谝韵铝鶄€(gè)方面相互競(jìng)爭(zhēng):
安裝:設(shè)置不需要正式的框架項(xiàng)目(它可以簡(jiǎn)單地作為包含的模塊放到現(xiàn)有的項(xiàng)目中)、啟動(dòng)所需的模板文件最少、或者帶有某種預(yù)先配置的設(shè)置,這是多么容易或簡(jiǎn)單。
文檔:幾乎每一個(gè)像樣的Python項(xiàng)目都有文檔,可以遍歷設(shè)置、演示基本用例并提供關(guān)于API的詳細(xì)信息。在這里,我們給這樣的框架更高的分?jǐn)?shù):這些框架展示了如何在教程中創(chuàng)建整個(gè)應(yīng)用程序,包括常見(jiàn)的配方或設(shè)計(jì)模式,以及超出職責(zé)范圍(例如提供有關(guān)如何運(yùn)行的詳細(xì)信息) Python變體(如PyPy或IronPython)下的框架。
管理:這是相對(duì)得分,表示配置和維護(hù)框架需要做多少工作。默認(rèn)情況下,工作量最小的框架得分更高。
原生能力:包含多少組件?得分較高的是那些為國(guó)際化,HTML模板和數(shù)據(jù)訪問(wèn)層提供原生支持的框架。還有一些框架使用Python最近引入的異步I/O操作的原生支持。
安全性:提供原生安全措施(如跨站點(diǎn)請(qǐng)求偽造(CSRF)保護(hù)和使用加密cookie的會(huì)話管理)的框架獲得更高的分?jǐn)?shù)。
可伸縮性:大多數(shù)Python框架可以利用像Gevent或Gunicorn這樣的項(xiàng)目來(lái)大規(guī)模運(yùn)行。在這里,我們看一下提升可伸縮性的框架原生特性,如輸出和頁(yè)面片段緩存。
如果你對(duì)性能基準(zhǔn)感到好奇,請(qǐng)查看TechEmpower正在進(jìn)行的一系列試驗(yàn),這些試驗(yàn)比較了各種任務(wù)中的多個(gè)Web框架,并將代碼和方法發(fā)布到GitHub并進(jìn)行不斷的重新評(píng)估。并非所有討論中的框架都在那里進(jìn)行了分析,但是可以很好地了解哪種框架在哪種負(fù)載下表現(xiàn)最佳。
我們將分析13個(gè)框架。其中五個(gè):CubicWeb,Django,Web2py,Weppy和Zope2,采用“控件”方法,包含你可以想象的Web應(yīng)用程序所需的大多數(shù)功能。其余八個(gè)框架: Bottle,CherryPy,F(xiàn)alcon,F(xiàn)lask,Pyramid,Tornado,Web.py和Wheezy.web,提供更簡(jiǎn)約的外觀,交易批量和完整性,簡(jiǎn)單易用。
讓我們從重量級(jí)開(kāi)始吧。
重量級(jí)的Python Web框架
CubicWeb
CubicWeb被稱(chēng)為“一個(gè)支持重用和面向?qū)ο笤O(shè)計(jì)的語(yǔ)義Web應(yīng)用程序框架?!边@是一個(gè)有趣的系統(tǒng),強(qiáng)調(diào)使用抽象和可重用的代碼塊稱(chēng)為“多維數(shù)據(jù)集”,但對(duì)于某些開(kāi)發(fā)人員來(lái)說(shuō)可能過(guò)于抽象或特殊。
多維數(shù)據(jù)集是具有模式(數(shù)據(jù)模型),實(shí)體(編程邏輯)和視圖的軟件組件。通過(guò)組合多個(gè)立方體,每個(gè)立方體執(zhí)行自己的任務(wù),可以通過(guò)重用自己的代碼和其他代碼來(lái)編寫(xiě)軟件應(yīng)用程序。
CubicWeb的核心是提供每個(gè)Web應(yīng)用程序使用的基本搭建材料:用于數(shù)據(jù)連接和存儲(chǔ)的“存儲(chǔ)庫(kù)”;用于基本HTTP請(qǐng)求/響應(yīng)和CRUD操作的“Web引擎”;以及用于建模數(shù)據(jù)的模式。所有這些都在Python類(lèi)定義中描述。要設(shè)置和管理CubicWeb的實(shí)例,可以使用類(lèi)似于Django的命令行工具。
CubicWeb似乎沒(méi)有使用Python 3的原生異步功能。包含異步的一種迂回方式是使用cubicweb.pyramid模塊將Pyramid框架用作Web服務(wù)器,并使用異步構(gòu)造在Pyramid上繪制。但是現(xiàn)在看起來(lái)更加直截了當(dāng)。
要在CubicWeb應(yīng)用程序中獲取或操作持久數(shù)據(jù),可以使用關(guān)系查詢(xún)語(yǔ)言(RQL),它采用模糊的SQL語(yǔ)法,但在W3C的SparQL之后進(jìn)行模式化。CubicWeb的理由再次是抽象:RQL提供了一種高度分離的路徑來(lái)相互關(guān)聯(lián)各種數(shù)據(jù)源。但是,隨著它的實(shí)現(xiàn),通過(guò)手動(dòng)構(gòu)建查詢(xún)作為字符串,它可能會(huì)讓習(xí)慣于ORM的開(kāi)發(fā)人員感到過(guò)時(shí)。
使用CubicWeb還有其他障礙。首先,設(shè)置可能很麻煩。因?yàn)镃ubicWeb有很多依賴(lài)項(xiàng),所以最好使用pip install來(lái)獲取所有依賴(lài)項(xiàng)??赡苓€必須在本地環(huán)境中執(zhí)行一定數(shù)量的手動(dòng)調(diào)整。這與運(yùn)行pip install或?qū)⒖蚣艽a放入另一個(gè)項(xiàng)目的子文件夾的其他框架形成鮮明對(duì)比,這就是所需要的。
另一個(gè)潛在的問(wèn)題是缺少本機(jī)模板引擎;生成HTML留給開(kāi)發(fā)人員??梢酝ㄟ^(guò)使用像Jinja2這樣的第三方模板系統(tǒng)或選擇為Web UI提供工具的多維數(shù)據(jù)集來(lái)克服這個(gè)問(wèn)題,例如Boostrap HTML框架的工具。
CubicWeb的一個(gè)長(zhǎng)期問(wèn)題,缺乏Python 3支持,目前已經(jīng)解決。截至2016年6月的版本3.23,CubicWeb支持Python 3,但Twisted等模塊本身并未完全移植。
與Web2py一樣,CubicWeb將其冗長(zhǎng)的文檔稱(chēng)為“書(shū)籍”。它需要時(shí)間來(lái)解釋CubicWeb的不尋常方法,演示如何構(gòu)建一些基本應(yīng)用程序,包括API引用,并且通常不會(huì)特定的方式。
Django
自Django首次出現(xiàn)以來(lái)已經(jīng)有十年,它已經(jīng)成為Python最廣泛部署的用于創(chuàng)建Web應(yīng)用程序的框架之一。 Django配備了你可能需要的大部分組件,因此它傾向于構(gòu)建大型應(yīng)用程序而不是小型應(yīng)用程序。
經(jīng)過(guò)多年在版本1.x后,Django最近在小數(shù)點(diǎn)的左邊創(chuàng)建了一個(gè)版本。 Django 2.0中最大的變化是框架現(xiàn)在只適用于Python 3.4及更高版本。理想情況下,你應(yīng)該使用Python 3.x,所以使用Django的1.x分支的唯一原因是你遇到了舊版本的Python。
Django吸引力的一個(gè)關(guān)鍵部分是部署速度。因?yàn)樗碎_(kāi)發(fā)普通Web應(yīng)用程序所需的許多部分,所以可以快速行動(dòng)。路由,URL解析,數(shù)據(jù)庫(kù)連接(包括ORM),表單驗(yàn)證,攻擊保護(hù)和模板都是內(nèi)置的。
將找到最常見(jiàn)的Web應(yīng)用程序方案的構(gòu)建塊。例如,用戶管理可在大多數(shù)網(wǎng)站上找到,因此Django將其作為標(biāo)準(zhǔn)元素提供。Django本身具有這些功能,而不必創(chuàng)建自己的系統(tǒng)來(lái)跟蹤用戶帳戶,會(huì)話,密碼,登錄/注銷(xiāo),管理員權(quán)限等。它們可以按原樣使用或擴(kuò)展,以包含最少量工作的新用例。
- 核心是BSD,一些組件是LGPLv3。
- 可通過(guò)zope.formlib獲得;單獨(dú)安裝但作為項(xiàng)目的一部分支持。
- 通過(guò)第三方擴(kuò)展程序提供。
Django具有健全和安全的默認(rèn)設(shè)置,有助于保護(hù)Web應(yīng)用程序免受攻擊。將變量放在頁(yè)面模板中時(shí),例如帶有HTML或JavaScript的字符串,除非明確將變量實(shí)例指定為安全,否則不會(huì)按字面意義呈現(xiàn)內(nèi)容。這本身就減少了許多常見(jiàn)的跨站腳本問(wèn)題。如果要執(zhí)行表單驗(yàn)證,可以使用從簡(jiǎn)單的CSRF保護(hù)到返回詳細(xì)錯(cuò)誤反饋的完整逐個(gè)字段驗(yàn)證機(jī)制的所有內(nèi)容。
如果沒(méi)有強(qiáng)大的文檔可以使用像Django那樣豐富和廣泛的功能。Django的文檔站點(diǎn)從多個(gè)角度深入研究框架的各個(gè)方面。使用Python 3或其他語(yǔ)言,正確的安全性,實(shí)現(xiàn)常見(jiàn)的Web應(yīng)用程序組件(如會(huì)話或分頁(yè)),生成站點(diǎn)地圖,它們都被覆蓋。還詳細(xì)描述了應(yīng)用程序模型,視圖和模板的每個(gè)層的API。
然而,強(qiáng)大的力量帶來(lái)了極大的復(fù)雜性。Django應(yīng)用程序以其頭重腳輕而聞名,具有許多移動(dòng)部件。即使只有幾條路線的簡(jiǎn)單Django應(yīng)用程序也需要相當(dāng)多的配置才能運(yùn)行。如果你的工作只是設(shè)置幾個(gè)簡(jiǎn)單的REST端點(diǎn),Django幾乎肯定是矯枉過(guò)正的。
Django也有它的怪癖。例如,頁(yè)面模板不能使用callables。示例:可以將{{user.name}}作為模板中的組件傳遞,但不能傳遞{{user.get_name()}}。這是Django確保模板不會(huì)無(wú)意中做出令人討厭的事情的方法之一,但如果你沒(méi)有為它們做好準(zhǔn)備,這些限制可能會(huì)很刺激。雖然有解決方法,但它們往往會(huì)對(duì)性能產(chǎn)生影響。
Django的核心是同步。但是,添加異步行為的一種方法是通過(guò)Django Channels項(xiàng)目。這個(gè)項(xiàng)目是官方的Django附加組件,它為Django添加了對(duì)連接和套接字的異步處理,同時(shí)保留了Django的編程習(xí)慣用法。
web2py
在Ruby世界中,Ruby on Rails是事實(shí)上的Web框架。DePaul大學(xué)計(jì)算機(jī)科學(xué)教授Massimo Di Pierro受到Rails的啟發(fā),用Python創(chuàng)建一個(gè)易于設(shè)置和使用的Web框架。結(jié)果是Web2py。
Web2py最大的吸引力在于其內(nèi)置的開(kāi)發(fā)環(huán)境。當(dāng)設(shè)置Web2py實(shí)例時(shí),將獲得一個(gè)Web界面,實(shí)際上是一個(gè)在線Python應(yīng)用程序編輯器,可以在其中配置應(yīng)用程序的組件。這通常意味著創(chuàng)建模型,視圖和控制器,每個(gè)都通過(guò)Python模塊或HTML模板進(jìn)行描述。一些示例應(yīng)用程序隨附Web2py??梢詫⑺鼈兎珠_(kāi)來(lái)查看它們的工作方式,或?qū)⑺鼈冇米鲉?dòng)器模板來(lái)創(chuàng)建自己的應(yīng)用程序。
開(kāi)發(fā)人員通常只需下載源代碼并使用它來(lái)部署Web2py。但對(duì)于Windows或MacOS上技術(shù)含量較低的用戶,Web2py的創(chuàng)建者提供的版本基本上是獨(dú)立服務(wù)器。下載,解壓縮并運(yùn)行其中一個(gè)版本,將擁有一個(gè)內(nèi)置Web2py預(yù)配置副本的本地Web服務(wù)器。這是一個(gè)很好的方法來(lái)創(chuàng)建一個(gè)Web2py應(yīng)用程序,然后可以部署其他地方。
Web2py的Web界面是使用Bootstrap 2.16.1構(gòu)建的,因此它易于操作并且易于導(dǎo)航。瀏覽器內(nèi)編輯器不能替代完整的IDE,但它配備了有用的輔助工具,如行編號(hào)和Python語(yǔ)法高亮(包括自動(dòng)縮進(jìn))。還包括一個(gè)Python shell的快速Web界面,因此如果需要,可以從命令行與Web2py交互,這對(duì)專(zhuān)家來(lái)說(shuō)是一個(gè)很好的讓步。
Web2py中使用的數(shù)據(jù)抽象系統(tǒng)與Django的ORM和受其啟發(fā)的其他ORM(例如Peewee)略有不同。這些系統(tǒng)使用Python類(lèi)來(lái)定義模型,在Web2py中,使用構(gòu)造函數(shù)(如define_table)來(lái)實(shí)例化模型。這些差異中的大部分可能只會(huì)對(duì)那些已經(jīng)有過(guò)經(jīng)驗(yàn)并且開(kāi)始使用另一個(gè)的人產(chǎn)生震動(dòng);他們對(duì)新人來(lái)說(shuō)同樣復(fù)雜。將Web2py連接到數(shù)據(jù)提供者可能不會(huì)遇到任何麻煩,因?yàn)樗鼛缀跎婕艾F(xiàn)有的每個(gè)主要數(shù)據(jù)庫(kù)。
一個(gè)真正有用的數(shù)據(jù)庫(kù)相關(guān)功能是生成模型圖的能力,更好地可視化模型之間的相互關(guān)系。但是,需要安裝pygraphviz庫(kù)才能啟用該功能。
Web2py通過(guò)對(duì)jQuery和AJAX的集成支持,提供許多其他專(zhuān)業(yè)級(jí)組件:國(guó)際化功能,多種緩存方法,訪問(wèn)控制和授權(quán),甚至前端效果(例如,表單中的日期選擇器)。雖然不允許使用中間件來(lái)替換核心Web2py功能,但也包括外部和內(nèi)部中間件的掛鉤。
Web2py的一個(gè)重要限制是它僅與Python 2.x兼容。首先,這意味著Web2py無(wú)法使用Python 3的異步語(yǔ)法。如果你依賴(lài)于Python 3獨(dú)有的外部庫(kù),那么你就不走運(yùn)了。但是,正在開(kāi)展使Web2py Python 3兼容的工作,并且在撰寫(xiě)本文時(shí)它已接近完成。
毫無(wú)疑問(wèn),Web2py的文檔被稱(chēng)為“書(shū)”。首先,它涵蓋了Web2py,Python以及用于這兩者的部署環(huán)境的大量材料。其次,它以高度可訪問(wèn)的敘事風(fēng)格書(shū)寫(xiě)。第三,它深入討論了常見(jiàn)的應(yīng)用程序構(gòu)建方案。例如,有一整章使用jQuery(與Web2Py捆綁在一起)來(lái)構(gòu)建AJAX應(yīng)用程序。
Weppy
Weppy感覺(jué)就像Flask的簡(jiǎn)約風(fēng)格和Django的完整性之間的中間標(biāo)記。雖然開(kāi)發(fā)Weppy應(yīng)用程序具有Flash的直接性,但Weppy具有Django中的許多功能,如數(shù)據(jù)層和身份驗(yàn)證。因此,Weppy適用于從極其簡(jiǎn)單到適度復(fù)雜的應(yīng)用程序。
乍一看,Weppy代碼看起來(lái)很像Flask或Bottle代碼。啟動(dòng)和運(yùn)行基本的單路網(wǎng)站需要很少的指示。路徑可以通過(guò)函數(shù)裝飾器(簡(jiǎn)單方法)或以編程方式描述,并且這樣做的語(yǔ)法與Flask/Bottle密切相關(guān)。除了語(yǔ)法的微小變化外,模板的工作方式大致相同。
Weppy與其他框架形成鮮明對(duì)比,包括它們僅作為插件或附加組件包含的一些功能。例如,F(xiàn)lask和Bottle都沒(méi)有內(nèi)置的ORM或數(shù)據(jù)管理系統(tǒng)。Weppy包含一個(gè)ORM,雖然它是基于pyDAL項(xiàng)目而不是更受歡迎的SQLAlchemy。Weppy甚至支持模式遷移,Django支持模式遷移作為其ORM的一部分(同樣,Django的遷移系統(tǒng)也更加自動(dòng)化)。雖然Weppy有一個(gè)擴(kuò)展機(jī)制,但官方批準(zhǔn)的附加組件列表很小,遠(yuǎn)小于Flask的擴(kuò)展目錄。
像Weppy這樣的輕量級(jí)框架通常用于構(gòu)建RESTful API,而Weppy則為此配備了便利功能。在路由上放置一個(gè)@service修飾器,返回的數(shù)據(jù)將自動(dòng)格式化為選擇的JSON或XML。
Weppy包含的其他功能更符合更大的框架,但它們是在沒(méi)有批量的情況下實(shí)現(xiàn)的。示例:數(shù)據(jù)驗(yàn)證機(jī)制,表單處理,響應(yīng)緩存和用戶驗(yàn)證。在所有這些情況下,Weppy采取“恰到好處”的方法。提供的功能并不像在Django大小的框架中那樣完整,但開(kāi)發(fā)人員不需要投入大量精力來(lái)使它們變得有用,并且它們可以在事后得到擴(kuò)展。
Weppy中發(fā)現(xiàn)的另一個(gè)通常與更重量級(jí)框架相關(guān)的功能是國(guó)際化支持。模板中的字符串可以根據(jù)應(yīng)用程序提供的區(qū)域設(shè)置文件進(jìn)行翻譯,這些文件是簡(jiǎn)單的Python字典。也可以通過(guò)解析瀏覽器請(qǐng)求(即Accept-Language HTTP標(biāo)頭)或?qū)⒎g綁定到特定路由來(lái)設(shè)置語(yǔ)言選擇。
Weppy的文檔與框架本身具有相同的風(fēng)格。它干凈,可讀,并且被人類(lèi)消費(fèi)。除了通常的“hello world”應(yīng)用程序示例之外,它還包含一個(gè)很好的演練教程,可以讓你創(chuàng)建一個(gè)微博系統(tǒng)作為初學(xué)者項(xiàng)目。
Weppy的長(zhǎng)期計(jì)劃包括支持異步和套接字作為低級(jí)一流實(shí)體。 Weppy的開(kāi)發(fā)人員計(jì)劃在2.0版本中引入這些功能,然后要求所有未來(lái)版本的Weppy使用Python 3.7或更高版本。
Zope2
Zope不適用于簡(jiǎn)單的RESTful API(每Bottle或Flask),甚至不適用于具有交互性的基本網(wǎng)站(à la Django)。相反,它意味著是一個(gè)完整的企業(yè)級(jí)應(yīng)用程序服務(wù)器堆棧,類(lèi)似于Java產(chǎn)品。該文檔將該框架描述為“對(duì)組件開(kāi)發(fā)人員,整合者和Web設(shè)計(jì)人員最有用?!币粋€(gè)主要的第三方產(chǎn)品Plone CMS使用Zope作為其基礎(chǔ),并作為Zope持續(xù)開(kāi)發(fā)的主要驅(qū)動(dòng)力。
Zope通過(guò)從Web獲取請(qǐng)求,將請(qǐng)求的參數(shù)與內(nèi)部對(duì)象數(shù)據(jù)庫(kù)(ZODB)匹配,并使用請(qǐng)求的GET或POST參數(shù)執(zhí)行該對(duì)象來(lái)工作。無(wú)論從對(duì)象返回什么,都會(huì)返回給客戶端。 Zope使用此數(shù)據(jù)庫(kù)對(duì)象系統(tǒng)來(lái)簡(jiǎn)化任務(wù),例如分配粒度對(duì)象權(quán)限,為對(duì)象提供繼承層次結(jié)構(gòu),以及處理數(shù)據(jù)庫(kù)對(duì)象的事務(wù)和回滾。
由于Zope的尺寸和復(fù)雜性,安裝需要一些工作;這不是簡(jiǎn)單地將源解壓縮到項(xiàng)目子文件夾中的問(wèn)題。一些設(shè)置過(guò)程包括編譯C模塊,因此在Windows上安裝很棘手。自2010年以來(lái),Zope的預(yù)打包Windows二進(jìn)制文件尚未更新,并且圍繞它們的文檔狀態(tài)使得很難確定設(shè)置的最佳實(shí)踐。但是,實(shí)際框架的文檔非常好。 Zope2 Book是一本非常詳細(xì)的綱要。
當(dāng)啟動(dòng)Zope并連接到服務(wù)器時(shí),將看到Web UI,可以在其中創(chuàng)建和編輯ZODB對(duì)象。對(duì)象采用三種基本角色之一:內(nèi)容,邏輯和表示,并且可以包含文檔(基本上,任何具有MIME類(lèi)型的文件),Python腳本和HTML模板。
模板可以是兩種類(lèi)型之一:新的和更靈活的Zope頁(yè)面模板(ZPT)系統(tǒng),或舊的和更基本的DTML標(biāo)記系統(tǒng)。ZPT使用HTML標(biāo)記中的屬性來(lái)指示數(shù)據(jù)的放置位置,從而可以更輕松地使用傳統(tǒng)的HTML工具設(shè)計(jì)模板。但是ZPT語(yǔ)法需要一些時(shí)間來(lái)習(xí)慣。
Zope聲稱(chēng)其面向?qū)ο蠓椒ǖ膬?yōu)點(diǎn)之一是系統(tǒng)中的每個(gè)操作,無(wú)論它作用于何種對(duì)象,都由事務(wù)封裝。因此,如果刪除存儲(chǔ)在Zope數(shù)據(jù)庫(kù)中的文件或?qū)σ欢未a進(jìn)行破壞性更改,則只需回滾執(zhí)行它的操作。缺點(diǎn)是很難在這樣的代碼庫(kù)上使用像Git這樣的現(xiàn)代源代碼控制工具,這意味著你將數(shù)據(jù)放在Zope的自定義數(shù)據(jù)庫(kù)工具的支配下。請(qǐng)注意,可以將MySQL之類(lèi)的外部數(shù)據(jù)庫(kù)連接到Zope應(yīng)用程序,但這主要用于托管應(yīng)用程序數(shù)據(jù),而不是替換ZODB。
與這里討論的許多較小的,更靈活的框架相比,Zope的遺留和大小轉(zhuǎn)化為許多缺點(diǎn)。最大的缺點(diǎn)是Zope只能在Python 2.x下運(yùn)行,所以不能利用Python 3庫(kù)或異步語(yǔ)法,盡管正在努力解決這個(gè)問(wèn)題。 (Zope 4仍處于測(cè)試階段,包括Python 3支持以及更多支持。)
輕量級(jí)的Python Web框架
Bottle
Bottle可以被認(rèn)為是一種迷你燒瓶,因?yàn)樗绕渌拔⒖蚣堋备泳o湊和簡(jiǎn)潔。由于其占地面積最小,Bottle非常適合包含在其他項(xiàng)目中或快速交付REST API等小型項(xiàng)目。
Bottle的整個(gè)代碼庫(kù)適合單個(gè)文件,并且絕對(duì)沒(méi)有外部依賴(lài)性。即便如此,Bottle還配備了足夠的功能來(lái)構(gòu)建常見(jiàn)的Web應(yīng)用程序,而無(wú)需依賴(lài)外部幫助。
Bottle中的路由系統(tǒng)將URL映射到函數(shù),其語(yǔ)法與Flask幾乎完全相同。也不僅限于硬連線路徑;可以動(dòng)態(tài)創(chuàng)建它們。可以通過(guò)Bottle框架中的對(duì)象訪問(wèn)和操作請(qǐng)求和響應(yīng)數(shù)據(jù),cookie,查詢(xún)變量,來(lái)自POST操作的表單數(shù)據(jù),HTTP標(biāo)頭和文件上載。
每項(xiàng)功能都經(jīng)過(guò)精心細(xì)致的實(shí)施。例如,使用文件上載,如果文件的命名約定與目標(biāo)文件系統(tǒng)沖突(例如Windows上的名稱(chēng)中的斜杠),則不必重命名該文件;瓶子可以幫到你。
Bottle包含自己的簡(jiǎn)單HTML模板引擎。同樣,雖然很小,但它已經(jīng)裝配好了必需品。默認(rèn)情況下,模板中包含的變量使用安全HTML呈現(xiàn);你必須指出哪些變量可以安全地從字面上重現(xiàn)。如果更換掉模板引擎并使用另一個(gè)模板引擎,例如Jinja2,那么Bottle可以幫助輕松完成。我其實(shí)喜歡與Bottle捆綁的簡(jiǎn)單模板系統(tǒng);它的語(yǔ)法不起眼,它允許混合代碼和模板文本而不會(huì)有不適當(dāng)?shù)睦щy。
Bottle甚至支持多個(gè)服務(wù)器后端。它配備了自己的內(nèi)置miniserver以進(jìn)行快速測(cè)試,但可以支持各種兼容WSGI的HTTP服務(wù)器,并在需要時(shí)可以回退到普通的舊CGI。
Bottle不需要像其他框架那樣多的文檔,但文檔絕不是吝嗇。所有關(guān)鍵的東西都適合單個(gè)(盡管很長(zhǎng))的網(wǎng)頁(yè)。除此之外,還可以找到每個(gè)API的完整文檔,如何在各種基礎(chǔ)架構(gòu)上進(jìn)行部署的示例,內(nèi)置模板語(yǔ)言的解釋以及一系列常見(jiàn)配方。
與Flask一樣,可以手動(dòng)或通過(guò)編寫(xiě)補(bǔ)充瓶的插件擴(kuò)展Bottle的功能。 Bottle插件列表遠(yuǎn)不及Flask的大小,但有一些有用的部分,例如與各種數(shù)據(jù)庫(kù)層的集成和基本的用戶身份驗(yàn)證。對(duì)于異步支持,Bottle可以使用異步運(yùn)行的現(xiàn)有服務(wù)器適配器之一,例如aiohttp/uvloop。
Bottle極簡(jiǎn)主義的一個(gè)后果是有些功能根本就不存在。不支持表單驗(yàn)證,包括CSRF保護(hù)等功能。如果要構(gòu)建支持高度用戶交互的Web應(yīng)用程序,則需要自己添加它們。
CherryPy
CherryPy已經(jīng)存在了超過(guò)10年,但并沒(méi)有失去最初區(qū)分它的極簡(jiǎn)主義和優(yōu)雅。
這個(gè)框架的前提是,除了只包含為web頁(yè)面提供服務(wù)所需的少量?jī)?nèi)容外,它應(yīng)該盡可能地讓人感覺(jué)它不像“web框架”,而是像任何其他類(lèi)型的Python應(yīng)用程序一樣。根據(jù)文件顯示,Hulu和Netflix等網(wǎng)站在制作中使用了CherryPy,這可能是因?yàn)樵摽蚣芴峁┝艘粋€(gè)高度低調(diào)的基礎(chǔ)。
CherryPy可以將Web應(yīng)用程序與核心邏輯區(qū)分開(kāi)來(lái)。要將應(yīng)用程序的功能映射到CherryPy提供的URL或路由,需要?jiǎng)?chuàng)建一個(gè)類(lèi),其中對(duì)象的名稱(chēng)空間直接映射到您要提供的URL;例如,網(wǎng)站的根由名為“index”的函數(shù)提供。傳遞給這些函數(shù)的參數(shù)用于處理由GET或POST方法提供的變量。
CherryPy包含的位用作低級(jí)構(gòu)建塊。包括會(huì)話標(biāo)識(shí)符和cookie處理,但不包括HTML模板。像Bottle一樣,CherryPy提供了一種將路由映射到磁盤(pán)上的目錄以供靜態(tài)文件服務(wù)的方法。
- 建議通過(guò)WTForms庫(kù)進(jìn)行擴(kuò)展。
- 通過(guò)第三方擴(kuò)展程序提供。
CherryPy通常會(huì)遵循現(xiàn)有的第三方庫(kù)來(lái)支持某個(gè)功能,而不是嘗試本機(jī)提供它。 例如,CherryPy不直接支持WebSocket應(yīng)用程序,而是通過(guò)ws4py庫(kù)支持。
CherryPy的文檔包含一個(gè)方便的教程,介紹了該程序的各個(gè)方面。與其他框架教程不同,它不會(huì)引導(dǎo)完成一個(gè)完整的端到端應(yīng)用程序,但它仍然有用。這些文檔提供了有關(guān)各種場(chǎng)景中部署的方便說(shuō)明,包括虛擬主機(jī),通過(guò)Apache和Nginx的反向代理以及許多其他方案。
CherryPy在引擎下使用池化線程,更好地支持多線程服務(wù)器適配器。如果想嘗試其他方法,CherryPy的非官方第三方分支交換asyncio協(xié)程而不是線程。
Falcon
如果正在構(gòu)建基于REST的API而不是其他任何東西,那么Falcon提供的絕對(duì)必要。它的設(shè)計(jì)精簡(jiǎn)而快速,幾乎沒(méi)有標(biāo)準(zhǔn)庫(kù)之外的依賴(lài)關(guān)系。
Falcon獲得“輕薄”標(biāo)簽的原因很大一部分與框架中的代碼行數(shù)無(wú)關(guān)。這是因?yàn)镕alcon在應(yīng)用程序上幾乎沒(méi)有任何結(jié)構(gòu)。Falcon應(yīng)用程序所要做的就是指出哪些函數(shù)映射到哪些API端點(diǎn)。從給定端點(diǎn)返回JSON只需設(shè)置路由并通過(guò)Python標(biāo)準(zhǔn)庫(kù)中的json.dumps函數(shù)從中返回?cái)?shù)據(jù)。對(duì)Python 3的async的支持尚未落入Falcon,但正在努力實(shí)現(xiàn)這一目標(biāo)。
Falcon還采用了理智的開(kāi)箱即用默認(rèn)設(shè)置,因此安裝時(shí)幾乎不需要修改。例如,對(duì)于未明確聲明的任何路由,默認(rèn)情況下會(huì)引發(fā)404。如果要將錯(cuò)誤返回給客戶端,可以引發(fā)與框架捆綁在一起的許多庫(kù)存異常中的一個(gè)(例如HTTPBadRequest)或使用泛型falcon.HTTPError異常。如果需要為給定路線進(jìn)行預(yù)處理或后處理,F(xiàn)alcon也會(huì)為這些路徑提供掛鉤。
Falcon對(duì)API的關(guān)注意味著用傳統(tǒng)的HTML用戶界面構(gòu)建Web應(yīng)用程序幾乎沒(méi)有。例如,表單處理功能和CSRF保護(hù)工具幾乎不存在。也就是說(shuō),F(xiàn)alcon提供了優(yōu)雅的選項(xiàng)來(lái)擴(kuò)展其功能,因此可以構(gòu)建更復(fù)雜的項(xiàng)目。除了上面提到的掛鉤機(jī)制之外,還可以找到一個(gè)用于創(chuàng)建中間件的界面,該界面可用于包裝所有Falcon的API。
Falcon的文檔與其他框架相比比較細(xì)長(zhǎng),但僅僅因?yàn)樗母采w范圍較小。用戶指南包括所有主要功能的正式逐步演練,以及一個(gè)快速入門(mén)部分,可讓您查看帶或不帶注釋的示例代碼。
Flask
關(guān)于Python中的Web框架的大多數(shù)討論都是從Flask開(kāi)始提到的,并且有充分的理由。 Flask是一個(gè)成熟的,易于理解的框架,廣泛使用且非常穩(wěn)定。使用Flask進(jìn)行輕量級(jí)Web項(xiàng)目或基本REST API幾乎不可能出錯(cuò),但如果試圖構(gòu)建更大的東西,將面臨繁重的工作。
Flask的核心吸引力在于其進(jìn)入門(mén)檻低。一個(gè)基本的“hello world”Flask應(yīng)用程序可以在少于10行的Python中設(shè)置。廣泛使用的HTML模板系統(tǒng)Jinja2附帶了使渲染文本變得容易的框架,但是Jinja2可以換成任何數(shù)量的其他模板引擎(例如Mustache),或者可以自己動(dòng)手。
簡(jiǎn)潔的名稱(chēng),F(xiàn)lask默認(rèn)省略了許多細(xì)節(jié)。例如,它沒(méi)有開(kāi)箱即用的數(shù)據(jù)層或ORM,也沒(méi)有類(lèi)似表單驗(yàn)證的規(guī)定。但是,它可以通過(guò)擴(kuò)展進(jìn)行擴(kuò)展,其中有幾十個(gè),包括許多常見(jiàn)用例,如緩存,表單處理和驗(yàn)證,數(shù)據(jù)庫(kù)連接等。這種默認(rèn)設(shè)計(jì)允許開(kāi)始設(shè)計(jì)具有絕對(duì)最小功能的Flask應(yīng)用程序,然后僅在需要時(shí)將所需的部分分層。
Flask的文檔和藹可親,易于閱讀??焖偃腴T(mén)文檔非常出色地幫助啟動(dòng)和運(yùn)行,同時(shí)還解釋了為簡(jiǎn)單的Flask應(yīng)用程序所做的默認(rèn)選擇的重要性,并且API文檔充滿了如何使用所有內(nèi)容的良好示例。同樣優(yōu)秀的是“片段”的集合,這些片段是如何使用Flask完成特定任務(wù)的快速和骯臟的示例,例如如果存在如何返回對(duì)象,如果不存在則返回404錯(cuò)誤。
Flask在2018年早些時(shí)候發(fā)布了它的里程碑1.0版本,Python 2.6和Python 3.3是支持的最低版本,并且它的許多行為最終都是一成不變的。Flask沒(méi)有明確支持Python的異步語(yǔ)法,但是為了滿足這種需求,已經(jīng)剝離了一個(gè)名為Quart的與Flask相關(guān)的API兼容變體。
Pyramid
小而輕,Pyramid比Django更接近Flask甚至Falcon。因此,它非常適合于將現(xiàn)有Python代碼公開(kāi)為REST API,或者為開(kāi)發(fā)人員完成大部分繁重任務(wù)的Web項(xiàng)目提供核心的任務(wù)。
描述Pyramid極簡(jiǎn)主義的一個(gè)好方法是“無(wú)策略”,這是在文檔部分中使用的一個(gè)術(shù)語(yǔ),用于討論P(yáng)yramid如何與其他Web框架形成對(duì)比。你使用什么樣的數(shù)據(jù)庫(kù)或什么樣的模板語(yǔ)言不是金字塔的關(guān)注點(diǎn)。
“Pyramid僅提供一種機(jī)制來(lái)映射URL以查看代碼,”文檔說(shuō),“以及一組用于調(diào)用這些視圖的約定??梢宰杂傻卦谀膽?yīng)用程序中使用符合您需求的第三方組件。“
構(gòu)建基本的Pyramid應(yīng)用程序只需要很少的工作。與Bottle和Flask一樣,Pyramid應(yīng)用程序可以包含單個(gè)Python文件,除了框架本身的文件。一個(gè)簡(jiǎn)單的單路徑API不需要十幾行代碼。其中大部分是來(lái)自... import語(yǔ)句和設(shè)置WSGI服務(wù)器的樣板。
默認(rèn)情況下,Pyramid包含Web應(yīng)用程序中常見(jiàn)的幾個(gè)項(xiàng)目,但它們是作為要拼接在一起的組件提供的,而不是完整的解決方案。例如,包括對(duì)用戶會(huì)話的支持,它甚至還帶有CSRF保護(hù)。但是對(duì)Django提供的用戶帳戶(例如登錄或帳戶管理)的支持不是交易的一部分。您必須自己滾動(dòng)或通過(guò)插件添加它。表單處理和數(shù)據(jù)庫(kù)連接也是如此。
Pyramid避免過(guò)于極小的一種方法是通過(guò)提供從Pyramid項(xiàng)目制作模板的方法來(lái)重用或重新使用先前的工作。這些模板,即Scaffolds,生成一個(gè)帶有簡(jiǎn)單路由和一些入門(mén)HTML / CSS模板的Pyramid應(yīng)用程序。默認(rèn)情況下,Pyramid包含的支架包括一個(gè)示例啟動(dòng)項(xiàng)目和一個(gè)通過(guò)常用的Python庫(kù)SQLAlchemy連接到數(shù)據(jù)庫(kù)的項(xiàng)目。
Pyramid在測(cè)試和調(diào)試工具方面同樣細(xì)長(zhǎng)。在Pyramid應(yīng)用程序中捆綁debugtoolbar擴(kuò)展,將在應(yīng)用程序生成的每個(gè)網(wǎng)頁(yè)上獲得一個(gè)可點(diǎn)擊圖標(biāo),該圖標(biāo)生成有關(guān)應(yīng)用程序執(zhí)行的詳細(xì)信息,包括發(fā)生錯(cuò)誤時(shí)的詳細(xì)回溯。還存在記錄和單元測(cè)試,即使從這個(gè)輕量級(jí)的框架中排除兩個(gè)看起來(lái)也很愚蠢的項(xiàng)目。
Pyramid的文檔很棒。除了快速瀏覽基礎(chǔ)知識(shí)和教程式演練之外,還可以找到一組社區(qū)貢獻(xiàn)的教程,用于構(gòu)建各種項(xiàng)目和常用食譜的烹飪手冊(cè)。后者包括針對(duì)大量目標(biāo)環(huán)境的部署技術(shù),從Google App Engine到Nginx。
Pyramid支持Python 2和Python 3,但不使用Python 3的異步語(yǔ)法。有關(guān)如何在Pyramid中利用異步的線索,請(qǐng)參閱aiopyramid項(xiàng)目,其中包括用于異步驅(qū)動(dòng)的“hello world”應(yīng)用程序的腳手架。
Tornado
Tornado是針對(duì)特定用例的另一個(gè)小框架。Tornado專(zhuān)為構(gòu)建異步網(wǎng)絡(luò)應(yīng)用程序而設(shè)計(jì),非常適合創(chuàng)建同時(shí)打開(kāi)大量網(wǎng)絡(luò)連接并使其保持活動(dòng)狀態(tài)的服務(wù),即涉及WebSockets或長(zhǎng)輪詢(xún)的任何內(nèi)容。
像Bottle或Falcon一樣,Tornado省略了與其核心目的無(wú)關(guān)的特征。例如,Tornado有一個(gè)內(nèi)置的模板系統(tǒng),用于生成輸出(以HTML或其他方式)和國(guó)際化,表單處理,cookie設(shè)置,用戶身份驗(yàn)證和CSRF保護(hù)的機(jī)制。但是它省略了類(lèi)似于表單驗(yàn)證和ORM的功能,它們更適合面向用戶的Web應(yīng)用程序。
Tornado擅長(zhǎng)為需要嚴(yán)密控制異步網(wǎng)絡(luò)細(xì)節(jié)的應(yīng)用程序提供基礎(chǔ)架構(gòu)。例如,Tornado不僅提供內(nèi)置的異步HTTP服務(wù)器,還提供異步HTTP客戶端。因此,Tornado非常適合構(gòu)建應(yīng)用程序,例如Web scraper或bot,它們并行查詢(xún)其他站點(diǎn)并對(duì)返回的數(shù)據(jù)進(jìn)行操作。
如果正在嘗試創(chuàng)建一個(gè)使用HTTP以外的協(xié)議的應(yīng)用程序,Tornado會(huì)提供幫助。它提供對(duì)DNS解析器以及第三方認(rèn)證服務(wù)等實(shí)用程序的低級(jí)TCP連接和套接字的訪問(wèn),并支持通過(guò)WSGI標(biāo)準(zhǔn)與其他框架進(jìn)行互操作。文檔很小但不稀疏,包含了如何完成所有這些的大量示例。
Tornado既利用并補(bǔ)充了Python的異步行為本機(jī)功能。如果使用的是Python 3.5,Tornado支持內(nèi)置的異步和等待關(guān)鍵字,它們可以為應(yīng)用程序提供速度提升。對(duì)于早期版本的Python,可以使用yield語(yǔ)句。在任何一種情況下,都可以使用期貨或回調(diào)來(lái)處理對(duì)事件的響應(yīng)。
Tornado 5.0改進(jìn)了與Python的本機(jī)異步功能的集成。因此不再支持Python 3.3,并且Python 3.5用戶必須使用Python 3.5.2或更高版本。 Tornado 6.0將需要Python 3.5及更高版本,并將完全放棄Python 2支持。
- 文檔描述為“類(lèi)BSD”.
- 由同一作者通過(guò)單獨(dú)的庫(kù)提供。
- 支持SQLAlchemy作為標(biāo)準(zhǔn)ORM但不包括在內(nèi)。
- Tornado wiki中提供的鏈接。
- 可通過(guò)第三方擴(kuò)展程序獲得。
Tornado還提供了一個(gè)同步原語(yǔ)庫(kù),信號(hào)量,鎖等,以協(xié)調(diào)異步協(xié)程之間的事件。請(qǐng)注意,與Python解釋器本身一樣,Tornado通常運(yùn)行單線程,因此這些原語(yǔ)與其線程名稱(chēng)不同。 但是,如果想在并行進(jìn)程中運(yùn)行Tornado以利用多個(gè)套接字和內(nèi)核,那么可以使用這些工具。
Tornado的文檔涵蓋了框架中的每個(gè)主要概念以及模型中的所有主要API。 雖然它包含一個(gè)示例應(yīng)用程序(網(wǎng)絡(luò)抓取工具),但它主要用于演示Tornado的排隊(duì)模塊。
Web.py
Web.py最初是由已故的Aaron Swartz創(chuàng)建的,并被用作Reddit的原始基礎(chǔ)。盡管Reddit可能已經(jīng)從Web.py轉(zhuǎn)移,但Web.py繼續(xù)由其他人維護(hù),主要是Anand Chitipothu。在范圍和設(shè)計(jì)上,Web.py類(lèi)似于Bottle和Flask;你可以把它當(dāng)作一個(gè)基本的骨架,然后在它上面構(gòu)建,而不會(huì)感覺(jué)太受限制。
要調(diào)用基本的Web.py實(shí)例,需要做的就是傳遞一個(gè)URL和函數(shù)映射列表。 URL可以包含帶有捕獲參數(shù)的正則表達(dá)式,允許使用/users/RayB或/article/451等格式從URL中提取數(shù)據(jù)。 Bottle具有類(lèi)似的機(jī)制,但也提供了確保參數(shù)符合某些標(biāo)準(zhǔn)的方法(例如,它們只能是整數(shù))。
Web.py在很大程度上保持干凈和樸素,因?yàn)樗粫?huì)嘗試承擔(dān)其他機(jī)制更好處理的任務(wù)。例如,沒(méi)有本機(jī)功能允許從Web.py堆棧提供靜態(tài)內(nèi)容;說(shuō)明明智地建議改為通過(guò)Web服務(wù)器。相比之下,Bottle具有提供靜態(tài)內(nèi)容的本機(jī)功能,盡管它是可選的。 Web.py還包括cookie和會(huì)話管理,甚至還有一個(gè)簡(jiǎn)單的輸出緩存。
Web.py有一個(gè)HTML模板系統(tǒng);它是非?;镜?,但允許if/then/else邏輯。更復(fù)雜,更有用的是Web.py的動(dòng)態(tài)生成HTML表單的系統(tǒng),具有CSS樣式的類(lèi)屬性和基本的表單驗(yàn)證機(jī)制。如果希望使用以編程方式生成的表單(例如基本數(shù)據(jù)庫(kù)資源管理器)生成應(yīng)用程序,這將非常方便。
Web.py的文檔與框架本身一樣小,但它并沒(méi)有提供相關(guān)的示例。 “cookbook”部分(多種語(yǔ)言,不低于)演示了許多常見(jiàn)用例(提供靜態(tài)內(nèi)容,逐步傳輸大型文件等)。甚至還有一個(gè)使用該框架構(gòu)建的真實(shí)Web應(yīng)用程序庫(kù),其中許多都帶有源代碼。
請(qǐng)注意,Web.py并未像其他框架一樣保持與Python 3兼容性的最新?tīng)顟B(tài)。這不僅意味著缺乏對(duì)異步語(yǔ)法的支持,還意味著缺少對(duì)已棄用的函數(shù)的錯(cuò)誤。此外,目前尚不清楚維護(hù)者是否有計(jì)劃在Python 2到達(dá)其支持生命周期結(jié)束后保持Web.py的最新?tīng)顟B(tài)。
Wheezy.web
Wheezy.web是Web框架的Flask/Bottle/Pyramid模型:小巧輕便,專(zhuān)注于提供高速和高并發(fā)性。這個(gè)功能集的核心是小的,但它的創(chuàng)建者已經(jīng)為它配備了各種必備功能。
談?wù)揥heezy.web作為單一產(chǎn)品有點(diǎn)誤導(dǎo)。Wheezy.web將同一作者創(chuàng)建的其他幾個(gè)庫(kù)粘合在一起,每個(gè)庫(kù)根據(jù)希望應(yīng)用程序的操作提供不同的服務(wù)。例如,Wheezy.http庫(kù)被Wheezy.web大量用于許多基本行為,但除非應(yīng)用程序必須執(zhí)行用戶身份驗(yàn)證,否則不需要Wheezy.security庫(kù)。
這種庫(kù)集合方法意味著使用Wheezy開(kāi)發(fā)的最簡(jiǎn)單方法是從PyPI安裝它或使用easy_install來(lái)收集所有相關(guān)的包。我在Python 3.51中使用easy_install時(shí)遇到了問(wèn)題,但它在Python 2.7中運(yùn)行良好。
Wheezy.web的核心主要是將路由映射到函數(shù)和處理重定向,但它配備了一些其他有用的功能。例如,使用@secure裝飾器標(biāo)記的任何路由將僅接受HTTPS請(qǐng)求,并且如果進(jìn)行HTTP連接嘗試將重定向到HTTPS。另一個(gè)核心添加是中間件,以便可以自定義路徑路由和HTTP錯(cuò)誤。
Wheezy的其他庫(kù)涵蓋了一組相當(dāng)豐富的用例。Wheezy.validation可以幫助確保提交的數(shù)據(jù)滿足特定條件,例如,用戶名或密碼滿足長(zhǎng)度或復(fù)雜性要求。Wheezy.caching允許緩存未更改的響應(yīng)以加速處理,Wheezy.captcha與Python的PIL/Pillow圖像庫(kù)集成以生成驗(yàn)證碼。對(duì)于國(guó)際化,它與標(biāo)準(zhǔn)GNU gettext實(shí)用程序集成。
核心Wheezy.web框架不包含模板引擎。如果需要做的不僅僅是返回純文本或JSON,可以添加Wheezy.template引擎或連接許多第三方引擎,如Jinja2和Mako。 Wheezy.web也省略了ORM; Wheezy文檔中的示例通過(guò)手動(dòng)SQL字符串使用SQLite。
使用Wheezy構(gòu)建應(yīng)用程序需要比使用Flask或Bottle更多的樣板,但不要過(guò)分;其中大部分涉及設(shè)置路線和中間件,這些東西可以在不費(fèi)力的情況下抽象出來(lái)。Wheezy的文檔中詳細(xì)解釋了這些細(xì)節(jié),其中包括“創(chuàng)建留言簿”教程,但其他方面則是關(guān)于獎(jiǎng)金的。
Wheezy的開(kāi)發(fā)似乎已經(jīng)停滯不前,因?yàn)樵擁?xiàng)目的最后一次提交都記錄在2015年。這對(duì)于保持與新Python功能的兼容性并不是好兆頭。
權(quán)衡Python Web框架選項(xiàng)
選擇Python Web框架與選擇任何其他軟件工具沒(méi)什么不同:它完全是為了適應(yīng)目標(biāo)和適應(yīng)自己的開(kāi)發(fā)習(xí)慣和偏好。
如果更喜歡minimal,只需創(chuàng)建一個(gè)REST API或在Web框架中包裝現(xiàn)有的Python代碼,這里描述的許多Python框架都非常適合你的需求。在這方面,F(xiàn)lask和Bottle是很好的選擇。由于其緊湊性,Bottle特別適合包含在其他項(xiàng)目中。
Pyramid和CherryPy的項(xiàng)目結(jié)構(gòu)相對(duì)較少,因此它們對(duì)于快速包裝現(xiàn)有代碼非常有用。在這方面,F(xiàn)alcon和Tornado更加微弱。它們的開(kāi)銷(xiāo)很小,但也缺乏更強(qiáng)大的Web應(yīng)用程序所需的更重的工具。 Web.py是涉及用戶交互(例如表單提交)的應(yīng)用程序的快速起點(diǎn)。 Wheezy.web和它的庫(kù)允許按照自己想要的功能去做。
對(duì)于具有更高端需求的開(kāi)發(fā)人員而言,Django是最好的起點(diǎn)之一,不僅因?yàn)槠鋼碛胸S富的開(kāi)箱即用組件,而且龐大的用戶社區(qū)多年來(lái)取得了巨大成功。如果你不需要這樣的完整性,Weppy是一個(gè)很好的折衷方案,因?yàn)樗雀〉目蚣芫哂懈鄶U(kuò)展的功能集。
最后,雖然CubicWeb和Zope2僅提供整個(gè)開(kāi)發(fā)環(huán)境而不是框架,但它們都是頭重腳輕和特殊的。使用它們是以學(xué)習(xí)它們的特性為代價(jià)的。
網(wǎng)頁(yè)標(biāo)題:13個(gè)Python Web框架比較,你想使用哪個(gè)呢?
文章鏈接:http://m.fisionsoft.com.cn/article/cocdpgi.html


咨詢(xún)
建站咨詢(xún)
