1. 程式人生 > >python web框架介紹對比

python web框架介紹對比

Django

Python框架雖然說是百花齊放,但仍然有那麼一家是最大的,它就是Django。要說Django是Python框架裡最好的,有人同意也有人 堅決反對,但說Django的文件最完善、市場佔有率最高、招聘職位最多估計大家都沒什麼意見。Django為人所稱道的地方主要有:

完美的文件,Django的成功,我覺得很大一部分原因要歸功於Django近乎完美的官方文件(包括Django book)。

全套的解決方案,Django象Rails一樣,提供全套的解決方案(full-stack framework + batteries included),基本要什麼有什麼(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,開發網 站應手的工具Django基本都給你做好了,因此開發效率是不用說的,出了問題也算好找,不在你的程式碼裡就在Django的原始碼裡。

強大的URL路由配置,Django讓你可以設計出非常優雅的URL,在Django裡你基本可以跟醜陋的GET引數說拜拜。

自助管理後臺,admin interface是Django裡比較吸引眼球的一項contrib,讓你幾乎不用寫一行程式碼就擁有一個完整的後臺管理介面。

而Django的缺點主要源自Django堅持自己造所有的輪子,整個系統相對封閉,Django最為人詬病的地方有:

系統緊耦合,如果你覺得Django內建的某項功能不是很好,想用喜歡的第三方庫來代替是很難的,比如下面將要說的ORM、Template。要在Django裡用SQLAlchemy或Mako幾乎是不可能,即使打了一些補丁用上了也會讓你覺得非常非常彆扭。

Django自帶的ORM遠不如SQLAlchemy強大,除了在Django這一畝三分地,SQLAlchemy是Python世界裡事實上的ORM標準,其它框架都支援SQLAlchemy了,唯獨Django仍然堅持自己的那一套。Django的開發人員對SQLAlchemy的支援也是有 過討論和嘗試的,不過最終還是放棄了,估計是代價太高且跟Django其它的模組很難合到一塊。

Template功能比較弱,不能插入Python程式碼,要寫複雜一點的邏輯需要另外用Python實現Tag或Filter。關於模板這一點,一直以來爭論比較多,最近有兩篇關於Python模板的比較有意思的文章可供參考:

  1. http://pydanny.blogspot.com/2010/12/stupid-template-languages.html
    (需FQ)
  2. http://techspot.zzzeek.org/2010/12/04/in-response-to-stupid-template-languages/

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”應用程式的腳手架。