Python四大主流網路編程框架
目前Python的網路編程框架已經多達幾十個,逐個學習它們顯然不現實。本文著重介紹目前4種主流Python網路框架:Django、Tornado、Flask、Twisted。
企業級開發框架——Django
Django於2003年誕生於美國堪薩斯(Kansas)州,最初用來製作在線新聞Web站點,於2005年加入了BSD許可證家族,成為開源網路框架。Django根據比利時的爵士音樂家Django Reinhardt命名,作者這樣命名Django意味著Django能優雅地演奏(開發)功能豐富的樂曲(Web應用)。
它是當前Python世界裡最負盛名且最成熟的網路框架。最初用來製作在線新聞的Web站點,目前已發展為應用最廣泛的Python網路框架。Django的各模塊之間結合得比較緊密,所以在功能強大的同時又是一個相對封閉的系統,但是其健全的在線文檔及開發社區,使開發者在遇到問題時能找到解決方法。
Django框架的特點
相對於Python的其他Web框架,Django的功能是最完整的,Django定義了服務發布、路由映射、模板編程、數據處理的一整套功能。這也意味著Django模塊之間緊密耦合,開發者需要學習Django自己定義的這一整套技術。Django的主要特點如下。
- 完善的文檔:經過10多年的發展和完善,Django有廣泛的應用和完善的在線文檔,開發者遇到問題時可以搜索在線文檔尋求解決方案。
- 集成數據訪問組件:Django的Model層自帶資料庫ORM組件,使開發者無須學習其他資料庫訪問技術(dbi、SQLAlchemy等)。
- 強大的URL映射技術:Django使用正則表達式管理URL映射,因此給開發者帶來了極高的靈活性。
- 後台管理系統自動生成:開發者只需通過簡單的幾行配置和代碼就可以實現完整的後台數據管理Web控制台。
- 錯誤信息非常完整:在開發調試過程中如果出現運行異常,則Django可以提供非常完整的錯誤信息幫助開發者定位問題,比如缺少xxx組件的配置引用等,這樣可以使開發者馬上改正錯誤。
Django的組成結構
Django是遵循MVC架構的Web開發框架,其主要由以下幾部分組成。
- 管理工具(Management):一套內置的創建站點、遷移數據、維護靜態文件的命令工具。
- 模型(Model):提供數據訪問介面和模塊,包括數據欄位、元數據、數據關係等的定義及操作。
- 視圖(View):Django的視圖層封裝了HTTP Request和Response的一系列操作和數據流,其主要功能包括URL映射機制、綁定模板等。
- 模板(Template):是一套Django自己的頁面渲染模板語言,用若干內置的tags和filters定義頁面的生成方式。
- 表單(Form):通過內置的數據類型和控制項生成HTML表單。
- 管理站(Admin):通過聲明需要管理的Model,快速生成後台數據管理網站。
高並發處理框架——Tornado
Tornado是使用Python編寫的一個強大的可擴展的Web伺服器。它在處理高網路流量時表現得足夠強健,卻在創建和編寫時有著足夠的輕量級,並能夠被用在大量的應用和工具中。Tornado作為FriendFeed網站的基礎框架,於2009年9月10日發布,目前已經獲得了很多社區的支持,並且在一系列不同的場合中得到應用。除FriendFeed和Facebook外,還有很多公司在生產上轉向Tornado,包括Quora、Turntable.fm、http://Bit.ly、Hipmunk及MyYearbook等。
相對於其他Python網路框架,Tornado有如下特點。
- 完備的Web框架:與Django、Flask等一樣,Tornado也提供了URL路由映射、Request上下文、基於模板的頁面渲染技術等開發Web應用的必備工具。
- 是一個高效的網路庫,性能與Twisted、Gevent等底層Python框架相媲美:提供了非同步I/O支持、超時事件處理。這使得Tornado除了可以作為Web應用伺服器框架,還可以用來做爬蟲應用、物聯網關、遊戲伺服器等後台應用。
- 提供高效HTTPClient:除了伺服器端框架,Tornado還提供了基於非同步框架的HTTP客戶端。
- 提供高效的內部HTTP伺服器:雖然其他Python網路框架(Django、Flask)也提供了內部HTTP伺服器,但它們的HTTP伺服器由於性能原因只能用於測試環境。而Tornado的HTTP伺服器與Tornado非同步調用緊密結合,可以直接用於生產環境。
- 完備的WebSocket支持:WebSocket是HTML5的一種新標準,實現了瀏覽器與伺服器之間的雙向實時通信。
因為Tornado的上述特點,Tornado常被用作大型站點的介面服務框架,而不像Django那樣著眼於建立完整的大型網站,所以本章著重講解Tornado的非同步及協程編程、身份認證框架、獨特的非WSGI部署方式。
支持快速建站的框架——Flask
Flask是Python Web框架族裡比較年輕的一個,於2010年出現,這使得它吸收了其他框架的優點,並且把自己的主要領域定義在了微小項目上。同時,它是可擴展的,Flask讓開發者自己選擇用什麼資料庫插件存儲他們的數據。很多功能簡單但性能卓越的網站就是基於Flask框架而搭建的,比如http://httpbin.org/就是一個功能簡單但性能強大的HTTP測試項目。Flask是一個面向簡單需求和小型應用的微框架。
相對於其他Python語言的Web框架而言,Flask的特點可以歸結如下。
- 內置開發伺服器和調試器 網路程序調試是在將編製好的網站投入實際運行前,用手工或編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程。有經驗的開發者都知道,這是保證網站系統能夠正式應用的必要步驟。
Flask 自帶的開發伺服器使開發者在調試程序時無須再安裝其他任何網路伺服器,比如Tomcat、JBoss、Apache等。Flask默認處於調試狀態,使得運行中的任何錯誤會同時向兩個目標發送信息:一個是Python Console,即啟動Python程序的控制台;另一個是HTTP客戶端,即Flask開發伺服器將調試信息傳遞給了客戶端。
- 與Python單元測試功能無縫銜接 單元測試是對最小軟體開發單元的測試,其重點測試程序的內部結構,主要採用白盒測試方法,由開發人員負責。單元測試的主要目標是保證函數在給定的輸入狀態下,能夠得到預想的輸出,在不符合要求時能夠提醒開發人員進行檢查。 Flask提供了一個與Python自帶的單元測試框架unitest無縫銜接的測試介面,即Flask對象的test_client()函數。通過test_client()函數,測試程序可以模擬進行HTTP訪問的客戶端來調用Flask路由處理函數,並且獲取函數的輸出來進行自定義的驗證。
- 使用Jinja2模板 將HTML頁面與後台應用程序聯繫起來一直是網站程序框架的一個重要目標。Flask通過使用Jinja2模板技術解決了這個問題。Jinja2是一個非常靈活的HTML模板技術,它是從Django模板發展而來的,但是比Django模板使用起來更加自由且更加高效。Jinja2模板使用配製的語義系統,提供靈活的模板繼承技術,自動抗擊XSS跨站攻擊並且易於調試。
- 完全兼容WSGI 1.0標準
WSGI(Web Server Gateway Interface)具有很強的伸縮性且能運行於多線程或多進程環境下,因為Python線程全局鎖的存在,使得WSGI的這個特性至關重要。WSGI已經是Python界的一個主要標準,各種大型網路伺服器對其都有良好的支持。WSGI位於Web應用程序與Web伺服器之間,與WSGI完全兼容使得Flask能夠配置到各種大型網路伺服器中。
- 基於Unicode編碼 Flask是完全基於Unicode的。這對製作非純ASCII字符集的網站來說非常方便。HTTP本身是基於位元組的,也就是說任何編碼格式都可以在HTTP中傳輸。但是,HTTP要求在HTTP Head中顯式地聲明在本次傳輸中所應用的編碼格式。在默認情況下,Flask會自動添加一個UTF-8編碼格式的HTTP Head,使程序員無須擔心編碼的問題。
底層自定義協議網路框架——Twisted
以上講到的3個Python Web框架都是圍繞著應用層HTTP展開的,而Twisted是一個例外。Twisted是一個用Python語言編寫的事件驅動的網路框架,對於追求伺服器程序性能的應用,Twisted框架是一個很好的選擇。
Twisted是一個有著10多年歷史的開源事件驅動框架。Twisted支持很多種協議,包括傳輸層的UDP、TCP、TLS,以及應用層的HTTP、FTP等。對於所有這些協議,Twisted提供了客戶端和伺服器方面的開發工具。
Twisted框架的歷史悠久,其主要發行版本都以Python 2為基礎,最新的版本為基於Python 2.7的Twisted-15.4.0。Twisted社區正在開發基於Python 3的版本,但目前為止尚沒有基於Python 3的Twisted穩定發行版。
Twisted是一個高性能的編程框架。在不同的操作系統平台上,Twisted利用不同的底層技術實現了高效能通信。在Windows中,Twisted的實現基於I/O完成埠(IOCP,Input/Output Completion Port)技術,它保證了底層高效地將I/O事件通知給框架及應用程序;在Linux中,Twisted的實現基於epoll技術,epoll是Linux下多路復用I/O介面select/poll的增強版本,它能顯著提高程序在大量並發連接中只有少量活躍的情況下的系統CPU利用率。
在開發方法上,Twisted引導程序員使用非同步編程模型。Twisted提供了豐富的Defer、Threading等特性來支持非同步編程。推薦閱讀: