13個Python Web框架比較,你想使用哪個呢?
Python程序員有很多很好的選擇來創(chuàng)建Web應用程序和API;Django,Weppy,Bottle和Flask引領潮流。
如果正在開發(fā)一個Web應用程序并且已經選擇使用Python作為構建它的語言,那么這是一個明智的選擇。Python的開發(fā)成熟度,強大的庫以及廣泛的實際應用使其成為Web開發(fā)的必需。
現在是困難的部分:從眾多可用的Python web框架中選擇一個。它們不僅數量在不斷增長,而且很難找到最適合你的。如果你正在構建一個快速而又簡單的REST API,那么你將不需要任何完整的面向用戶的應用程序所需的管道和連接,該應用程序具有用戶登錄、表單驗證和上傳處理就可以了。
在本文中,我們將研究13種最廣泛部署的Python web框架。我們將關注每種web應用程序最適合構建哪種類型的web應用程序,并研究它們如何在以下六個方面相互競爭:
安裝:設置不需要正式的框架項目(它可以簡單地作為包含的模塊放到現有的項目中)、啟動所需的模板文件最少、或者帶有某種預先配置的設置,這是多么容易或簡單。
文檔:幾乎每一個像樣的Python項目都有文檔,可以遍歷設置、演示基本用例并提供關于API的詳細信息。在這里,我們給這樣的框架更高的分數:這些框架展示了如何在教程中創(chuàng)建整個應用程序,包括常見的配方或設計模式,以及超出職責范圍(例如提供有關如何運行的詳細信息) Python變體(如PyPy或IronPython)下的框架。
管理:這是相對得分,表示配置和維護框架需要做多少工作。默認情況下,工作量最小的框架得分更高。
原生能力:包含多少組件?得分較高的是那些為國際化,HTML模板和數據訪問層提供原生支持的框架。還有一些框架使用Python最近引入的異步I/O操作的原生支持。
安全性:提供原生安全措施(如跨站點請求偽造(CSRF)保護和使用加密cookie的會話管理)的框架獲得更高的分數。
可伸縮性:大多數Python框架可以利用像Gevent或Gunicorn這樣的項目來大規(guī)模運行。在這里,我們看一下提升可伸縮性的框架原生特性,如輸出和頁面片段緩存。
如果你對性能基準感到好奇,請查看TechEmpower正在進行的一系列試驗,這些試驗比較了各種任務中的多個Web框架,并將代碼和方法發(fā)布到GitHub并進行不斷的重新評估。并非所有討論中的框架都在那里進行了分析,但是可以很好地了解哪種框架在哪種負載下表現最佳。
我們將分析13個框架。其中五個:CubicWeb,Django,Web2py,Weppy和Zope2,采用“控件”方法,包含你可以想象的Web應用程序所需的大多數功能。其余八個框架: Bottle,CherryPy,Falcon,Flask,Pyramid,Tornado,Web.py和Wheezy.web,提供更簡約的外觀,交易批量和完整性,簡單易用。
讓我們從重量級開始吧。
重量級的Python Web框架
CubicWeb
CubicWeb被稱為“一個支持重用和面向對象設計的語義Web應用程序框架。”這是一個有趣的系統(tǒng),強調使用抽象和可重用的代碼塊稱為“多維數據集”,但對于某些開發(fā)人員來說可能過于抽象或特殊。
多維數據集是具有模式(數據模型),實體(編程邏輯)和視圖的軟件組件。通過組合多個立方體,每個立方體執(zhí)行自己的任務,可以通過重用自己的代碼和其他代碼來編寫軟件應用程序。
CubicWeb的核心是提供每個Web應用程序使用的基本搭建材料:用于數據連接和存儲的“存儲庫”;用于基本HTTP請求/響應和CRUD操作的“Web引擎”;以及用于建模數據的模式。所有這些都在Python類定義中描述。要設置和管理CubicWeb的實例,可以使用類似于Django的命令行工具。
CubicWeb似乎沒有使用Python 3的原生異步功能。包含異步的一種迂回方式是使用cubicweb.pyramid模塊將Pyramid框架用作Web服務器,并使用異步構造在Pyramid上繪制。但是現在看起來更加直截了當。
要在CubicWeb應用程序中獲取或操作持久數據,可以使用關系查詢語言(RQL),它采用模糊的SQL語法,但在W3C的SparQL之后進行模式化。CubicWeb的理由再次是抽象:RQL提供了一種高度分離的路徑來相互關聯(lián)各種數據源。但是,隨著它的實現,通過手動構建查詢作為字符串,它可能會讓習慣于ORM的開發(fā)人員感到過時。
使用CubicWeb還有其他障礙。首先,設置可能很麻煩。因為CubicWeb有很多依賴項,所以最好使用pip install來獲取所有依賴項??赡苓€必須在本地環(huán)境中執(zhí)行一定數量的手動調整。這與運行pip install或將框架代碼放入另一個項目的子文件夾的其他框架形成鮮明對比,這就是所需要的。
另一個潛在的問題是缺少本機模板引擎;生成HTML留給開發(fā)人員??梢酝ㄟ^使用像Jinja2這樣的第三方模板系統(tǒng)或選擇為Web UI提供工具的多維數據集來克服這個問題,例如Boostrap HTML框架的工具。
CubicWeb的一個長期問題,缺乏Python 3支持,目前已經解決。截至2016年6月的版本3.23,CubicWeb支持Python 3,但Twisted等模塊本身并未完全移植。
與Web2py一樣,CubicWeb將其冗長的文檔稱為“書籍”。它需要時間來解釋CubicWeb的不尋常方法,演示如何構建一些基本應用程序,包括API引用,并且通常不會特定的方式。
Django
自Django首次出現以來已經有十年,它已經成為Python最廣泛部署的用于創(chuàng)建Web應用程序的框架之一。 Django配備了你可能需要的大部分組件,因此它傾向于構建大型應用程序而不是小型應用程序。
經過多年在版本1.x后,Django最近在小數點的左邊創(chuàng)建了一個版本。 Django 2.0中最大的變化是框架現在只適用于Python 3.4及更高版本。理想情況下,你應該使用Python 3.x,所以使用Django的1.x分支的唯一原因是你遇到了舊版本的Python。
Django吸引力的一個關鍵部分是部署速度。因為它包含了開發(fā)普通Web應用程序所需的許多部分,所以可以快速行動。路由,URL解析,數據庫連接(包括ORM),表單驗證,攻擊保護和模板都是內置的。
將找到最常見的Web應用程序方案的構建塊。例如,用戶管理可在大多數網站上找到,因此Django將其作為標準元素提供。Django本身具有這些功能,而不必創(chuàng)建自己的系統(tǒng)來跟蹤用戶帳戶,會話,密碼,登錄/注銷,管理員權限等。它們可以按原樣使用或擴展,以包含最少量工作的新用例。

- 核心是BSD,一些組件是LGPLv3。
- 可通過zope.formlib獲得;單獨安裝但作為項目的一部分支持。
- 通過第三方擴展程序提供。
Django具有健全和安全的默認設置,有助于保護Web應用程序免受攻擊。將變量放在頁面模板中時,例如帶有HTML或JavaScript的字符串,除非明確將變量實例指定為安全,否則不會按字面意義呈現內容。這本身就減少了許多常見的跨站腳本問題。如果要執(zhí)行表單驗證,可以使用從簡單的CSRF保護到返回詳細錯誤反饋的完整逐個字段驗證機制的所有內容。
如果沒有強大的文檔可以使用像Django那樣豐富和廣泛的功能。Django的文檔站點從多個角度深入研究框架的各個方面。使用Python 3或其他語言,正確的安全性,實現常見的Web應用程序組件(如會話或分頁),生成站點地圖,它們都被覆蓋。還詳細描述了應用程序模型,視圖和模板的每個層的API。
然而,強大的力量帶來了極大的復雜性。Django應用程序以其頭重腳輕而聞名,具有許多移動部件。即使只有幾條路線的簡單Django應用程序也需要相當多的配置才能運行。如果你的工作只是設置幾個簡單的REST端點,Django幾乎肯定是矯枉過正的。
Django也有它的怪癖。例如,頁面模板不能使用callables。示例:可以將{{user.name}}作為模板中的組件傳遞,但不能傳遞{{user.get_name()}}。這是Django確保模板不會無意中做出令人討厭的事情的方法之一,但如果你沒有為它們做好準備,這些限制可能會很刺激。雖然有解決方法,但它們往往會對性能產生影響。
Django的核心是同步。但是,添加異步行為的一種方法是通過Django Channels項目。這個項目是官方的Django附加組件,它為Django添加了對連接和套接字的異步處理,同時保留了Django的編程習慣用法。
web2py
在Ruby世界中,Ruby on Rails是事實上的Web框架。DePaul大學計算機科學教授Massimo Di Pierro受到Rails的啟發(fā),用Python創(chuàng)建一個易于設置和使用的Web框架。結果是Web2py。
Web2py最大的吸引力在于其內置的開發(fā)環(huán)境。當設置Web2py實例時,將獲得一個Web界面,實際上是一個在線Python應用程序編輯器,可以在其中配置應用程序的組件。這通常意味著創(chuàng)建模型,視圖和控制器,每個都通過Python模塊或HTML模板進行描述。一些示例應用程序隨附Web2py??梢詫⑺鼈兎珠_來查看它們的工作方式,或將它們用作啟動器模板來創(chuàng)建自己的應用程序。
開發(fā)人員通常只需下載源代碼并使用它來部署Web2py。但對于Windows或MacOS上技術含量較低的用戶,Web2py的創(chuàng)建者提供的版本基本上是獨立服務器。下載,解壓縮并運行其中一個版本,將擁有一個內置Web2py預配置副本的本地Web服務器。這是一個很好的方法來創(chuàng)建一個Web2py應用程序,然后可以部署其他地方。
Web2py的Web界面是使用Bootstrap 2.16.1構建的,因此它易于操作并且易于導航。瀏覽器內編輯器不能替代完整的IDE,但它配備了有用的輔助工具,如行編號和Python語法高亮(包括自動縮進)。還包括一個Python shell的快速Web界面,因此如果需要,可以從命令行與Web2py交互,這對專家來說是一個很好的讓步。
Web2py中使用的數據抽象系統(tǒng)與Django的ORM和受其啟發(fā)的其他ORM(例如Peewee)略有不同。這些系統(tǒng)使用Python類來定義模型,在Web2py中,使用構造函數(如define_table)來實例化模型。這些差異中的大部分可能只會對那些已經有過經驗并且開始使用另一個的人產生震動;他們對新人來說同樣復雜。將Web2py連接到數據提供者可能不會遇到任何麻煩,因為它幾乎涉及現有的每個主要數據庫。
一個真正有用的數據庫相關功能是生成模型圖的能力,更好地可視化模型之間的相互關系。但是,需要安裝pygraphviz庫才能啟用該功能。
Web2py通過對jQuery和AJAX的集成支持,提供許多其他專業(yè)級組件:國際化功能,多種緩存方法,訪問控制和授權,甚至前端效果(例如,表單中的日期選擇器)。雖然不允許使用中間件來替換核心Web2py功能,但也包括外部和內部中間件的掛鉤。
Web2py的一個重要限制是它僅與Python 2.x兼容。首先,這意味著Web2py無法使用Python 3的異步語法。如果你依賴于Python 3獨有的外部庫,那么你就不走運了。但是,正在開展使Web2py Python 3兼容的工作,并且在撰寫本文時它已接近完成。
毫無疑問,Web2py的文檔被稱為“書”。首先,它涵蓋了Web2py,Python以及用于這兩者的部署環(huán)境的大量材料。其次,它以高度可訪問的敘事風格書寫。第三,它深入討論了常見的應用程序構建方案。例如,有一整章使用jQuery(與Web2Py捆綁在一起)來構建AJAX應用程序。
Weppy
Weppy感覺就像Flask的簡約風格和Django的完整性之間的中間標記。雖然開發(fā)Weppy應用程序具有Flash的直接性,但Weppy具有Django中的許多功能,如數據層和身份驗證。因此,Weppy適用于從極其簡單到適度復雜的應用程序。
乍一看,Weppy代碼看起來很像Flask或Bottle代碼。啟動和運行基本的單路網站需要很少的指示。路徑可以通過函數裝飾器(簡單方法)或以編程方式描述,并且這樣做的語法與Flask/Bottle密切相關。除了語法的微小變化外,模板的工作方式大致相同。
Weppy與其他框架形成鮮明對比,包括它們僅作為插件或附加組件包含的一些功能。例如,Flask和Bottle都沒有內置的ORM或數據管理系統(tǒng)。Weppy包含一個ORM,雖然它是基于pyDAL項目而不是更受歡迎的SQLAlchemy。Weppy甚至支持模式遷移,Django支持模式遷移作為其ORM的一部分(同樣,Django的遷移系統(tǒng)也更加自動化)。雖然Weppy有一個擴展機制,但官方批準的附加組件列表很小,遠小于Flask的擴展目錄。
像Weppy這樣的輕量級框架通常用于構建RESTful API,而Weppy則為此配備了便利功能。在路由上放置一個@service修飾器,返回的數據將自動格式化為選擇的JSON或XML。
Weppy包含的其他功能更符合更大的框架,但它們是在沒有批量的情況下實現的。示例:數據驗證機制,表單處理,響應緩存和用戶驗證。在所有這些情況下,Weppy采取“恰到好處”的方法。提供的功能并不像在Django大小的框架中那樣完整,但開發(fā)人員不需要投入大量精力來使它們變得有用,并且它們可以在事后得到擴展。
Weppy中發(fā)現的另一個通常與更重量級框架相關的功能是國際化支持。模板中的字符串可以根據應用程序提供的區(qū)域設置文件進行翻譯,這些文件是簡單的Python字典。也可以通過解析瀏覽器請求(即Accept-Language HTTP標頭)或將翻譯綁定到特定路由來設置語言選擇。
Weppy的文檔與框架本身具有相同的風格。它干凈,可讀,并且被人類消費。除了通常的“hello world”應用程序示例之外,它還包含一個很好的演練教程,可以讓你創(chuàng)建一個微博系統(tǒng)作為初學者項目。
Weppy的長期計劃包括支持異步和套接字作為低級一流實體。 Weppy的開發(fā)人員計劃在2.0版本中引入這些功能,然后要求所有未來版本的Weppy使用Python 3.7或更高版本。

Zope2
Zope不適用于簡單的RESTful API(每Bottle或Flask),甚至不適用于具有交互性的基本網站(à la Django)。相反,它意味著是一個完整的企業(yè)級應用程序服務器堆棧,類似于Java產品。該文檔將該框架描述為“對組件開發(fā)人員,整合者和Web設計人員最有用。”一個主要的第三方產品Plone CMS使用Zope作為其基礎,并作為Zope持續(xù)開發(fā)的主要驅動力。
Zope通過從Web獲取請求,將請求的參數與內部對象數據庫(ZODB)匹配,并使用請求的GET或POST參數執(zhí)行該對象來工作。無論從對象返回什么,都會返回給客戶端。 Zope使用此數據庫對象系統(tǒng)來簡化任務,例如分配粒度對象權限,為對象提供繼承層次結構,以及處理數據庫對象的事務和回滾。
由于Zope的尺寸和復雜性,安裝需要一些工作;這不是簡單地將源解壓縮到項目子文件夾中的問題。一些設置過程包括編譯C模塊,因此在Windows上安裝很棘手。自2010年以來,Zope的預打包Windows二進制文件尚未更新,并且圍繞它們的文檔狀態(tài)使得很難確定設置的最佳實踐。但是,實際框架的文檔非常好。 Zope2 Book是一本非常詳細的綱要。
當啟動Zope并連接到服務器時,將看到Web UI,可以在其中創(chuàng)建和編輯ZODB對象。對象采用三種基本角色之一:內容,邏輯和表示,并且可以包含文檔(基本上,任何具有MIME類型的文件),Python腳本和HTML模板。
模板可以是兩種類型之一:新的和更靈活的Zope頁面模板(ZPT)系統(tǒng),或舊的和更基本的DTML標記系統(tǒng)。ZPT使用HTML標記中的屬性來指示數據的放置位置,從而可以更輕松地使用傳統(tǒng)的HTML工具設計模板。但是ZPT語法需要一些時間來習慣。
Zope聲稱其面向對象方法的優(yōu)點之一是系統(tǒng)中的每個操作,無論它作用于何種對象,都由事務封裝。因此,如果刪除存儲在Zope數據庫中的文件或對一段代碼進行破壞性更改,則只需回滾執(zhí)行它的操作。缺點是很難在這樣的代碼庫上使用像Git這樣的現代源代碼控制工具,這意味著你將數據放在Zope的自定義數據庫工具的支配下。請注意,可以將MySQL之類的外部數據庫連接到Zope應用程序,但這主要用于托管應用程序數據,而不是替換ZODB。
與這里討論的許多較小的,更靈活的框架相比,Zope的遺留和大小轉化為許多缺點。最大的缺點是Zope只能在Python 2.x下運行,所以不能利用Python 3庫或異步語法,盡管正在努力解決這個問題。 (Zope 4仍處于測試階段,包括Python 3支持以及更多支持。)
輕量級的Python Web框架
Bottle
Bottle可以被認為是一種迷你燒瓶,因為它比其他“微框架”更加緊湊和簡潔。由于其占地面積最小,Bottle非常適合包含在其他項目中或快速交付REST API等小型項目。
Bottle的整個代碼庫適合單個文件,并且絕對沒有外部依賴性。即便如此,Bottle還配備了足夠的功能來構建常見的Web應用程序,而無需依賴外部幫助。
Bottle中的路由系統(tǒng)將URL映射到函數,其語法與Flask幾乎完全相同。也不僅限于硬連線路徑;可以動態(tài)創(chuàng)建它們??梢酝ㄟ^Bottle框架中的對象訪問和操作請求和響應數據,cookie,查詢變量,來自POST操作的表單數據,HTTP標頭和文件上載。
每項功能都經過精心細致的實施。例如,使用文件上載,如果文件的命名約定與目標文件系統(tǒng)沖突(例如Windows上的名稱中的斜杠),則不必重命名該文件;瓶子可以幫到你。
Bottle包含自己的簡單HTML模板引擎。同樣,雖然很小,但它已經裝配好了必需品。默認情況下,模板中包含的變量使用安全HTML呈現;你必須指出哪些變量可以安全地從字面上重現。如果更換掉模板引擎并使用另一個模板引擎,例如Jinja2,那么Bottle可以幫助輕松完成。我其實喜歡與Bottle捆綁的簡單模板系統(tǒng);它的語法不起眼,它允許混合代碼和模板文本而不會有不適當的困難。
Bottle甚至支持多個服務器后端。它配備了自己的內置miniserver以進行快速測試,但可以支持各種兼容WSGI的HTTP服務器,并在需要時可以回退到普通的舊CGI。
Bottle不需要像其他框架那樣多的文檔,但文檔絕不是吝嗇。所有關鍵的東西都適合單個(盡管很長)的網頁。除此之外,還可以找到每個API的完整文檔,如何在各種基礎架構上進行部署的示例,內置模板語言的解釋以及一系列常見配方。
與Flask一樣,可以手動或通過編寫補充瓶的插件擴展Bottle的功能。 Bottle插件列表遠不及Flask的大小,但有一些有用的部分,例如與各種數據庫層的集成和基本的用戶身份驗證。對于異步支持,Bottle可以使用異步運行的現有服務器適配器之一,例如aiohttp/uvloop。
Bottle極簡主義的一個后果是有些功能根本就不存在。不支持表單驗證,包括CSRF保護等功能。如果要構建支持高度用戶交互的Web應用程序,則需要自己添加它們。
CherryPy
CherryPy已經存在了超過10年,但并沒有失去最初區(qū)分它的極簡主義和優(yōu)雅。
這個框架的前提是,除了只包含為web頁面提供服務所需的少量內容外,它應該盡可能地讓人感覺它不像“web框架”,而是像任何其他類型的Python應用程序一樣。根據文件顯示,Hulu和Netflix等網站在制作中使用了CherryPy,這可能是因為該框架提供了一個高度低調的基礎。
CherryPy可以將Web應用程序與核心邏輯區(qū)分開來。要將應用程序的功能映射到CherryPy提供的URL或路由,需要創(chuàng)建一個類,其中對象的名稱空間直接映射到您要提供的URL;例如,網站的根由名為“index”的函數提供。傳遞給這些函數的參數用于處理由GET或POST方法提供的變量。
CherryPy包含的位用作低級構建塊。包括會話標識符和cookie處理,但不包括HTML模板。像Bottle一樣,CherryPy提供了一種將路由映射到磁盤上的目錄以供靜態(tài)文件服務的方法。

- 建議通過WTForms庫進行擴展。
- 通過第三方擴展程序提供。
CherryPy通常會遵循現有的第三方庫來支持某個功能,而不是嘗試本機提供它。 例如,CherryPy不直接支持WebSocket應用程序,而是通過ws4py庫支持。
CherryPy的文檔包含一個方便的教程,介紹了該程序的各個方面。與其他框架教程不同,它不會引導完成一個完整的端到端應用程序,但它仍然有用。這些文檔提供了有關各種場景中部署的方便說明,包括虛擬主機,通過Apache和Nginx的反向代理以及許多其他方案。
CherryPy在引擎下使用池化線程,更好地支持多線程服務器適配器。如果想嘗試其他方法,CherryPy的非官方第三方分支交換asyncio協(xié)程而不是線程。
Falcon
如果正在構建基于REST的API而不是其他任何東西,那么Falcon提供的絕對必要。它的設計精簡而快速,幾乎沒有標準庫之外的依賴關系。
Falcon獲得“輕薄”標簽的原因很大一部分與框架中的代碼行數無關。這是因為Falcon在應用程序上幾乎沒有任何結構。Falcon應用程序所要做的就是指出哪些函數映射到哪些API端點。從給定端點返回JSON只需設置路由并通過Python標準庫中的json.dumps函數從中返回數據。對Python 3的async的支持尚未落入Falcon,但正在努力實現這一目標。
Falcon還采用了理智的開箱即用默認設置,因此安裝時幾乎不需要修改。例如,對于未明確聲明的任何路由,默認情況下會引發(fā)404。如果要將錯誤返回給客戶端,可以引發(fā)與框架捆綁在一起的許多庫存異常中的一個(例如HTTPBadRequest)或使用泛型falcon.HTTPError異常。如果需要為給定路線進行預處理或后處理,Falcon也會為這些路徑提供掛鉤。
Falcon對API的關注意味著用傳統(tǒng)的HTML用戶界面構建Web應用程序幾乎沒有。例如,表單處理功能和CSRF保護工具幾乎不存在。也就是說,Falcon提供了優(yōu)雅的選項來擴展其功能,因此可以構建更復雜的項目。除了上面提到的掛鉤機制之外,還可以找到一個用于創(chuàng)建中間件的界面,該界面可用于包裝所有Falcon的API。
Falcon的文檔與其他框架相比比較細長,但僅僅因為它的覆蓋范圍較小。用戶指南包括所有主要功能的正式逐步演練,以及一個快速入門部分,可讓您查看帶或不帶注釋的示例代碼。
Flask
關于Python中的Web框架的大多數討論都是從Flask開始提到的,并且有充分的理由。 Flask是一個成熟的,易于理解的框架,廣泛使用且非常穩(wěn)定。使用Flask進行輕量級Web項目或基本REST API幾乎不可能出錯,但如果試圖構建更大的東西,將面臨繁重的工作。
Flask的核心吸引力在于其進入門檻低。一個基本的“hello world”Flask應用程序可以在少于10行的Python中設置。廣泛使用的HTML模板系統(tǒng)Jinja2附帶了使渲染文本變得容易的框架,但是Jinja2可以換成任何數量的其他模板引擎(例如Mustache),或者可以自己動手。
簡潔的名稱,Flask默認省略了許多細節(jié)。例如,它沒有開箱即用的數據層或ORM,也沒有類似表單驗證的規(guī)定。但是,它可以通過擴展進行擴展,其中有幾十個,包括許多常見用例,如緩存,表單處理和驗證,數據庫連接等。這種默認設計允許開始設計具有絕對最小功能的Flask應用程序,然后僅在需要時將所需的部分分層。
Flask的文檔和藹可親,易于閱讀??焖偃腴T文檔非常出色地幫助啟動和運行,同時還解釋了為簡單的Flask應用程序所做的默認選擇的重要性,并且API文檔充滿了如何使用所有內容的良好示例。同樣優(yōu)秀的是“片段”的集合,這些片段是如何使用Flask完成特定任務的快速和骯臟的示例,例如如果存在如何返回對象,如果不存在則返回404錯誤。
Flask在2018年早些時候發(fā)布了它的里程碑1.0版本,Python 2.6和Python 3.3是支持的最低版本,并且它的許多行為最終都是一成不變的。Flask沒有明確支持Python的異步語法,但是為了滿足這種需求,已經剝離了一個名為Quart的與Flask相關的API兼容變體。
Pyramid
小而輕,Pyramid比Django更接近Flask甚至Falcon。因此,它非常適合于將現有Python代碼公開為REST API,或者為開發(fā)人員完成大部分繁重任務的Web項目提供核心的任務。
描述Pyramid極簡主義的一個好方法是“無策略”,這是在文檔部分中使用的一個術語,用于討論Pyramid如何與其他Web框架形成對比。你使用什么樣的數據庫或什么樣的模板語言不是金字塔的關注點。
“Pyramid僅提供一種機制來映射URL以查看代碼,”文檔說,“以及一組用于調用這些視圖的約定。可以自由地在您的應用程序中使用符合您需求的第三方組件。“
構建基本的Pyramid應用程序只需要很少的工作。與Bottle和Flask一樣,Pyramid應用程序可以包含單個Python文件,除了框架本身的文件。一個簡單的單路徑API不需要十幾行代碼。其中大部分是來自... import語句和設置WSGI服務器的樣板。
默認情況下,Pyramid包含Web應用程序中常見的幾個項目,但它們是作為要拼接在一起的組件提供的,而不是完整的解決方案。例如,包括對用戶會話的支持,它甚至還帶有CSRF保護。但是對Django提供的用戶帳戶(例如登錄或帳戶管理)的支持不是交易的一部分。您必須自己滾動或通過插件添加它。表單處理和數據庫連接也是如此。
Pyramid避免過于極小的一種方法是通過提供從Pyramid項目制作模板的方法來重用或重新使用先前的工作。這些模板,即Scaffolds,生成一個帶有簡單路由和一些入門HTML / CSS模板的Pyramid應用程序。默認情況下,Pyramid包含的支架包括一個示例啟動項目和一個通過常用的Python庫SQLAlchemy連接到數據庫的項目。
Pyramid在測試和調試工具方面同樣細長。在Pyramid應用程序中捆綁debugtoolbar擴展,將在應用程序生成的每個網頁上獲得一個可點擊圖標,該圖標生成有關應用程序執(zhí)行的詳細信息,包括發(fā)生錯誤時的詳細回溯。還存在記錄和單元測試,即使從這個輕量級的框架中排除兩個看起來也很愚蠢的項目。
Pyramid的文檔很棒。除了快速瀏覽基礎知識和教程式演練之外,還可以找到一組社區(qū)貢獻的教程,用于構建各種項目和常用食譜的烹飪手冊。后者包括針對大量目標環(huán)境的部署技術,從Google App Engine到Nginx。
Pyramid支持Python 2和Python 3,但不使用Python 3的異步語法。有關如何在Pyramid中利用異步的線索,請參閱aiopyramid項目,其中包括用于異步驅動的“hello world”應用程序的腳手架。
Tornado
Tornado是針對特定用例的另一個小框架。Tornado專為構建異步網絡應用程序而設計,非常適合創(chuàng)建同時打開大量網絡連接并使其保持活動狀態(tài)的服務,即涉及WebSockets或長輪詢的任何內容。
像Bottle或Falcon一樣,Tornado省略了與其核心目的無關的特征。例如,Tornado有一個內置的模板系統(tǒng),用于生成輸出(以HTML或其他方式)和國際化,表單處理,cookie設置,用戶身份驗證和CSRF保護的機制。但是它省略了類似于表單驗證和ORM的功能,它們更適合面向用戶的Web應用程序。
Tornado擅長為需要嚴密控制異步網絡細節(jié)的應用程序提供基礎架構。例如,Tornado不僅提供內置的異步HTTP服務器,還提供異步HTTP客戶端。因此,Tornado非常適合構建應用程序,例如Web scraper或bot,它們并行查詢其他站點并對返回的數據進行操作。
如果正在嘗試創(chuàng)建一個使用HTTP以外的協(xié)議的應用程序,Tornado會提供幫助。它提供對DNS解析器以及第三方認證服務等實用程序的低級TCP連接和套接字的訪問,并支持通過WSGI標準與其他框架進行互操作。文檔很小但不稀疏,包含了如何完成所有這些的大量示例。
Tornado既利用并補充了Python的異步行為本機功能。如果使用的是Python 3.5,Tornado支持內置的異步和等待關鍵字,它們可以為應用程序提供速度提升。對于早期版本的Python,可以使用yield語句。在任何一種情況下,都可以使用期貨或回調來處理對事件的響應。
Tornado 5.0改進了與Python的本機異步功能的集成。因此不再支持Python 3.3,并且Python 3.5用戶必須使用Python 3.5.2或更高版本。 Tornado 6.0將需要Python 3.5及更高版本,并將完全放棄Python 2支持。

- 文檔描述為“類BSD”.
- 由同一作者通過單獨的庫提供。
- 支持SQLAlchemy作為標準ORM但不包括在內。
- Tornado wiki中提供的鏈接。
- 可通過第三方擴展程序獲得。
Tornado還提供了一個同步原語庫,信號量,鎖等,以協(xié)調異步協(xié)程之間的事件。請注意,與Python解釋器本身一樣,Tornado通常運行單線程,因此這些原語與其線程名稱不同。 但是,如果想在并行進程中運行Tornado以利用多個套接字和內核,那么可以使用這些工具。
Tornado的文檔涵蓋了框架中的每個主要概念以及模型中的所有主要API。 雖然它包含一個示例應用程序(網絡抓取工具),但它主要用于演示Tornado的排隊模塊。
Web.py
Web.py最初是由已故的Aaron Swartz創(chuàng)建的,并被用作Reddit的原始基礎。盡管Reddit可能已經從Web.py轉移,但Web.py繼續(xù)由其他人維護,主要是Anand Chitipothu。在范圍和設計上,Web.py類似于Bottle和Flask;你可以把它當作一個基本的骨架,然后在它上面構建,而不會感覺太受限制。
要調用基本的Web.py實例,需要做的就是傳遞一個URL和函數映射列表。 URL可以包含帶有捕獲參數的正則表達式,允許使用/users/RayB或/article/451等格式從URL中提取數據。 Bottle具有類似的機制,但也提供了確保參數符合某些標準的方法(例如,它們只能是整數)。
Web.py在很大程度上保持干凈和樸素,因為它不會嘗試承擔其他機制更好處理的任務。例如,沒有本機功能允許從Web.py堆棧提供靜態(tài)內容;說明明智地建議改為通過Web服務器。相比之下,Bottle具有提供靜態(tài)內容的本機功能,盡管它是可選的。 Web.py還包括cookie和會話管理,甚至還有一個簡單的輸出緩存。
Web.py有一個HTML模板系統(tǒng);它是非?;镜?,但允許if/then/else邏輯。更復雜,更有用的是Web.py的動態(tài)生成HTML表單的系統(tǒng),具有CSS樣式的類屬性和基本的表單驗證機制。如果希望使用以編程方式生成的表單(例如基本數據庫資源管理器)生成應用程序,這將非常方便。
Web.py的文檔與框架本身一樣小,但它并沒有提供相關的示例。 “cookbook”部分(多種語言,不低于)演示了許多常見用例(提供靜態(tài)內容,逐步傳輸大型文件等)。甚至還有一個使用該框架構建的真實Web應用程序庫,其中許多都帶有源代碼。
請注意,Web.py并未像其他框架一樣保持與Python 3兼容性的最新狀態(tài)。這不僅意味著缺乏對異步語法的支持,還意味著缺少對已棄用的函數的錯誤。此外,目前尚不清楚維護者是否有計劃在Python 2到達其支持生命周期結束后保持Web.py的最新狀態(tài)。
Wheezy.web
Wheezy.web是Web框架的Flask/Bottle/Pyramid模型:小巧輕便,專注于提供高速和高并發(fā)性。這個功能集的核心是小的,但它的創(chuàng)建者已經為它配備了各種必備功能。
談論Wheezy.web作為單一產品有點誤導。Wheezy.web將同一作者創(chuàng)建的其他幾個庫粘合在一起,每個庫根據希望應用程序的操作提供不同的服務。例如,Wheezy.http庫被Wheezy.web大量用于許多基本行為,但除非應用程序必須執(zhí)行用戶身份驗證,否則不需要Wheezy.security庫。
這種庫集合方法意味著使用Wheezy開發(fā)的最簡單方法是從PyPI安裝它或使用easy_install來收集所有相關的包。我在Python 3.51中使用easy_install時遇到了問題,但它在Python 2.7中運行良好。
Wheezy.web的核心主要是將路由映射到函數和處理重定向,但它配備了一些其他有用的功能。例如,使用@secure裝飾器標記的任何路由將僅接受HTTPS請求,并且如果進行HTTP連接嘗試將重定向到HTTPS。另一個核心添加是中間件,以便可以自定義路徑路由和HTTP錯誤。
Wheezy的其他庫涵蓋了一組相當豐富的用例。Wheezy.validation可以幫助確保提交的數據滿足特定條件,例如,用戶名或密碼滿足長度或復雜性要求。Wheezy.caching允許緩存未更改的響應以加速處理,Wheezy.captcha與Python的PIL/Pillow圖像庫集成以生成驗證碼。對于國際化,它與標準GNU gettext實用程序集成。
核心Wheezy.web框架不包含模板引擎。如果需要做的不僅僅是返回純文本或JSON,可以添加Wheezy.template引擎或連接許多第三方引擎,如Jinja2和Mako。 Wheezy.web也省略了ORM; Wheezy文檔中的示例通過手動SQL字符串使用SQLite。
使用Wheezy構建應用程序需要比使用Flask或Bottle更多的樣板,但不要過分;其中大部分涉及設置路線和中間件,這些東西可以在不費力的情況下抽象出來。Wheezy的文檔中詳細解釋了這些細節(jié),其中包括“創(chuàng)建留言簿”教程,但其他方面則是關于獎金的。
Wheezy的開發(fā)似乎已經停滯不前,因為該項目的最后一次提交都記錄在2015年。這對于保持與新Python功能的兼容性并不是好兆頭。
權衡Python Web框架選項
選擇Python Web框架與選擇任何其他軟件工具沒什么不同:它完全是為了適應目標和適應自己的開發(fā)習慣和偏好。
如果更喜歡minimal,只需創(chuàng)建一個REST API或在Web框架中包裝現有的Python代碼,這里描述的許多Python框架都非常適合你的需求。在這方面,Flask和Bottle是很好的選擇。由于其緊湊性,Bottle特別適合包含在其他項目中。
Pyramid和CherryPy的項目結構相對較少,因此它們對于快速包裝現有代碼非常有用。在這方面,Falcon和Tornado更加微弱。它們的開銷很小,但也缺乏更強大的Web應用程序所需的更重的工具。 Web.py是涉及用戶交互(例如表單提交)的應用程序的快速起點。 Wheezy.web和它的庫允許按照自己想要的功能去做。
對于具有更高端需求的開發(fā)人員而言,Django是最好的起點之一,不僅因為其擁有豐富的開箱即用組件,而且龐大的用戶社區(qū)多年來取得了巨大成功。如果你不需要這樣的完整性,Weppy是一個很好的折衷方案,因為它比更小的框架具有更多擴展的功能集。
最后,雖然CubicWeb和Zope2僅提供整個開發(fā)環(huán)境而不是框架,但它們都是頭重腳輕和特殊的。使用它們是以學習它們的特性為代價的。
原文鏈接:
https://www.infoworld.com/article/3105502/python/review-13-python-web-frameworks-compared.html