Djangohtml
Python框架雖說是百花齊放,但仍然有那麼一家是最大的,它就是Django。要說Django是Python框架裏最好的,有人贊成也有人 堅定反對,但說Django的文檔最完善、市場佔有率最高、招聘職位最多估計你們都沒什麼意見。Django爲人所稱道的地方主要有:web
完美的文檔,Django的成功,我以爲很大一部分緣由要歸功於Django近乎完美的官方文檔(包括Django book)。數據庫
全套的解決方案,Django象Rails同樣,提供全套的解決方案(full-stack framework + batteries included),基本要什麼有什麼(好比:cache、session、feed、orm、geo、auth),並且所有Django本身造,開發網 站應手的工具Django基本都給你作好了,所以開發效率是不用說的,出了問題也算好找,不在你的代碼裏就在Django的源碼裏。django
強大的URL路由配置,Django讓你能夠設計出很是優雅的URL,在Django裏你基本能夠跟醜陋的GET參數說拜拜。緩存
自助管理後臺,admin interface是Django裏比較吸引眼球的一項contrib,讓你幾乎不用寫一行代碼就擁有一個完整的後臺管理界面。服務器
而Django的缺點主要源自Django堅持本身造全部的輪子,整個系統相對封閉,Django最爲人詬病的地方有:網絡
系統緊耦合,若是你以爲Django內置的某項功能不是很好,想用喜歡的第三方庫來代替是很難的,好比下面將要說的ORM、Template。要在Django裏用SQLAlchemy或Mako幾乎是不可能,即便打了一些補丁用上了也會讓你以爲很是很是彆扭。session
Django自帶的ORM遠不如SQLAlchemy強大,除了在Django這一畝三分地,SQLAlchemy是Python世界裏事實上的ORM標準,其它框架都支持SQLAlchemy了,惟獨Django仍然堅持本身的那一套。Django的開發人員對SQLAlchemy的支持也是有 過討論和嘗試的,不過最終仍是放棄了,估計是代價過高且跟Django其它的模塊很難合到一塊。多線程
Template功能比較弱,不能插入Python代碼,要寫複雜一點的邏輯須要另外用Python實現Tag或Filter。關於模板這一點,一直以來爭論比較多,最近有兩篇關於Python模板的比較有意思的文章可供參考:併發
URL配置雖然強大,但所有要手寫,這一點跟Rails的Convention over configuration的理念徹底相左,高手和初識Django的人配出來的URL會有很大差別。
讓人糾結的auth模塊,Django的auth跟其它模塊結合緊密,功能也挺強的,就是作的有點過了,用戶的數據庫schema都給你定好了,這樣問題就來了,好比不少網站要求email地址惟一,可schema裏這個字段的值不是惟一的,糾結是必須的了。
Python文件作配置文件,而不是更常見的ini、xml或yaml等形式。這自己不是什麼問題,但是由於理論上來講settings的值是可以動態的改變的(雖然你們不會這麼幹),但這不是最佳實踐的體現。
總的來講,Django大包大攬,用它來快速開發一些Web運用是很不錯的。若是你順着Django的設計哲學來,你會以爲Django很好用,越用越順手;相反,你若是不能融入或接受Django的設計哲學,你用Django必定會很痛苦,趁早放棄的好。因此說在有些人眼裏Django無異於仙丹, 但對有一些人來講它又是毒藥且劇毒。
Flask
關於Python中的Web框架的大多數討論都是從Flask開始提到的,而且有充分的理由。 Flask是一個成熟的,易於理解的框架,普遍使用且很是穩定。使用Flask進行輕量級Web項目或基本REST API幾乎不可能出錯,但若是試圖構建更大的東西,將面臨繁重的工做。
Flask的核心吸引力在於其進入門檻低。一個基本的「hello world」Flask應用程序能夠在少於10行的Python中設置。普遍使用的HTML模板系統Jinja2附帶了使渲染文本變得容易的框架,可是Jinja2能夠換成任何數量的其餘模板引擎(例如Mustache),或者能夠本身動手。
簡潔的名稱,Flask默認省略了許多細節。例如,它沒有開箱即用的數據層或ORM,也沒有相似表單驗證的規定。可是,它能夠經過擴展進行擴展,其中有幾十個,包括許多常見用例,如緩存,表單處理和驗證,數據庫鏈接等。這種默認設計容許開始設計具備絕對最小功能的Flask應用程序,而後僅在須要時將所需的部分分層。
Flask的文檔和善可親,易於閱讀。快速入門文檔很是出色地幫助啓動和運行,同時還解釋了爲簡單的Flask應用程序所作的默認選擇的重要性,而且API文檔充滿了如何使用全部內容的良好示例。一樣優秀的是「片斷」的集合,這些片斷是如何使用Flask完成特定任務的快速和骯髒的示例,例如若是存在如何返回對象,若是不存在則返回404錯誤。
Flask在2018年早些時候發佈了它的里程碑1.0版本,Python 2.6和Python 3.3是支持的最低版本,而且它的許多行爲最終都是一成不變的。Flask沒有明確支持Python的異步語法,可是爲了知足這種需求,已經剝離了一個名爲Quart的與Flask相關的API兼容變體。
Bottle
瓶子是一個微框架。Bottle最初意味着構建API,它將全部內容都實如今一個源文件中。除了Python標準庫以外,它沒有任何依賴關係。使用Bottle進行編碼可讓您更接近金屬而不是使用任何全棧框架進行編碼。
其默認功能包括路由,模板,實用程序以及WSGI標準的基本抽象。
路由 - 支持對函數調用映射的請求,使您能夠實現乾淨和動態的URL
模板 - 快速和Pythonic 開箱即用,全面支持mako,jinja2和獵豹
實用程序 - 溫馨地訪問表單數據,文件上傳,Cookie,標題和其餘與HTTP相關的元數據
服務器-支持一個內置的HTTP開發服務器fapws3,比約恩,GAE,СherryPy,以及任何其餘WSGI能力的HTTP服務器
Bottle是原型開發,學習Web框架組織以及構建簡單我的應用的完美解決方案。
CherryPy
CherryPy是一個開源,極簡主義的Web框架。它使構建Python Web應用程序與構建任何其餘面向對象的程序無異。
事實上,CherryPy支持的網絡應用程序是一個獨立的Python應用程序,它嵌入了本身的多線程網絡服務器。CherryPy應用程序可在任何支持Python的操做系統上運行(Windows,MacOS,Linux等)。它們能夠部署在任何能夠運行普通Python應用程序的地方。CherryPy應用程序不須要Apache,可是您能夠在Apache後面運行CherryPy應用程序,以及在Lighttpd或IIS後面運行它。
CherryPy不是一個很是有限的框架,由於它容許您使用任何類型的技術進行模板化,數據訪問等。可是,它仍然可以處理會話,靜態,Cookie,文件上傳以及web框架一般能夠執行的其餘任何操做。
一些默認的CherryPy功能包括:
一個HTTP / 1.1兼容WSGI線程池網絡服務器
簡單一次運行多個HTTP服務器
一個強大的配置系統
一個靈活的插件系統
出的現成的工具緩存,編碼,會話,認證,靜態內容,並等
內置支持分析,覆蓋和測試
可以在Python 2.7+,Python 3.1+,PyPy,Jython和Android上運行
異步框架
Sanic
Sanic是一個構建在uvloop上的Python Web框架,專門爲經過異步請求處理的快速HTTP響應而建立。
它運行在Python 3.5+上。Sanic支持異步請求處理程序,這使它與Python 3.5的異步/等待函數兼容。這提升了速度,提供了非阻塞功能。
在一個進程和100個鏈接的基準測試中,Sanic每秒可以處理33,342個請求。
Tornado
Tornado是一個Python Web框架和異步網絡庫。它使用非阻塞網絡I / O並解決C10k問題(意思是說,若是配置正確,它能夠處理10,000多個併發鏈接)。
這使它成爲構建須要高性能和數萬併發用戶的應用程序的理想工具。
龍捲風的主要特色是:
內置的用戶認證支持
實時服務
高品質的性能
基於Python的網頁模板語言
非阻塞HTTP客戶端
實施第三方認證和受權計劃(Google OpenID / OAuth,Facebook登陸,雅虎BBAuth,FriendFeed OpenID / OAuth,)
支持翻譯和本土化
Pyramid
小而輕,Pyramid比Django更接近Flask甚至Falcon。所以,它很是適合於將現有Python代碼公開爲REST API,或者爲開發人員完成大部分繁重任務的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擴展,將在應用程序生成的每一個網頁上得到一個可點擊圖標,該圖標生成有關應用程序執行的詳細信息,包括髮生錯誤時的詳細回溯。還存在記錄和單元測試,即便從這個輕量級的框架中排除兩個看起來也很愚蠢的項目。
Pyramid的文檔很棒。除了快速瀏覽基礎知識和教程式演練以外,還能夠找到一組社區貢獻的教程,用於構建各類項目和經常使用食譜的烹飪手冊。後者包括針對大量目標環境的部署技術,從Google App Engine到Nginx。
Pyramid支持Python 2和Python 3,但不使用Python 3的異步語法。有關如何在Pyramid中利用異步的線索,請參閱aiopyramid項目,其中包括用於異步驅動的「hello world」應用程序的腳手架。