目前Python的網絡編程框架已經多達幾十個,逐個學習它們顯然不現實。但這些框架在系統架構和運行環境中有不少共通之處,本文帶領讀者學習基於Python網絡框架開發的經常使用知識,及目前的4種主流Python網絡框架:Django、Tornado、Flask、Twisted。程序員
所謂網絡框架是指這樣的一組Python包,它可以使開發者專一於網站應用業務邏輯的開發,而無須處理網絡應用底層的協議、線程、進程等方面。這樣能大大提升開發者的工做效率,同時提升網絡應用程序的質量。正則表達式
在目前Python語言的幾十個開發框架中,幾乎全部的全棧網絡框架都強制或引導開發者使用MVC架構開發Web應用。所謂全棧網絡框架,是指除了封裝網絡和線程操做,還提供HTTP棧、數據庫讀寫管理、HTML模板引擎等一系列功能的網絡框架。本文重點講解的Django、Tornado和Flask是全棧網絡框架的典型標杆;而Twisted更專一於網絡底層的高性能封裝而不提供HTML模板引擎等界面功能,因此不能稱之爲全棧框架。數據庫
MVC(Model-View-Controller)模式最先由Trygve Reenskaug在1978年提出,在20世紀80年代是程序語言Smalltalk的一種內部架構。後來MVC被其餘語言所借鑑,成爲了軟件工程中的一種軟件架構模式。MVC把Web應用系統分爲3個基本部分。編程
這3個基本部分互相分離,使得在改進和升級界面及用戶交互流程時,不須要重寫業務邏輯及數據訪問代碼。MVC架構如圖1所示。瀏覽器
MVC架構圖服務器
注意:MVC在除Python外的其餘語言中也有普遍應用,例如VC++的MFC、Java的Structs及Spring、C#的.NET開發框架,讀者應該有深入的體會。網絡
接下來帶領你們學習當今主流的4種Python網絡框架。多線程
Django於2003年誕生於美國堪薩斯(Kansas)州,最初用來製做在線新聞Web站點,於2005年加入了BSD許可證家族,成爲開源網絡框架。Django根據比利時的爵士音樂家Django Reinhardt命名,做者這樣命名Django意味着Django能優雅地演奏(開發)功能豐富的樂曲(Web應用)。架構
它是當前Python世界裏最負盛名且最成熟的網絡框架。最初用來製做在線新聞的Web站點,目前已發展爲應用最普遍的Python網絡框架。Django的各模塊之間結合得比較緊密,因此在功能強大的同時又是一個相對封閉的系統,可是其健全的在線文檔及開發社區,使開發者在遇到問題時能找到解決方法。併發
Django框架的特色
相對於Python的其餘Web框架,Django的功能是最完整的,Django定義了服務發佈、路由映射、模板編程、數據處理的一整套功能。這也意味着Django模塊之間緊密耦合,開發者須要學習Django本身定義的這一整套技術。Django的主要特色以下。
Django的組成結構
Django是遵循MVC架構的Web開發框架,其主要由如下幾部分組成。
Tornado是使用Python編寫的一個強大的可擴展的Web服務器。它在處理高網絡流量時表現得足夠強健,卻在建立和編寫時有着足夠的輕量級,並可以被用在大量的應用和工具中。Tornado做爲FriendFeed網站的基礎框架,於2009年9月10日發佈,目前已經得到了不少社區的支持,而且在一系列不一樣的場合中獲得應用。除FriendFeed和Facebook外,還有不少公司在生產上轉向Tornado,包括Quora、Turntable.fm、Bit.ly、Hipmunk及MyYearbook等。
相對於其餘Python網絡框架,Tornado有以下特色。
由於Tornado的上述特色,Tornado常被用做大型站點的接口服務框架,而不像Django那樣着眼於創建完整的大型網站,因此本章着重講解Tornado的異步及協程編程、身份認證框架、獨特的非WSGI部署方式。
Flask是Python Web框架族裏比較年輕的一個,於2010年出現,這使得它吸取了其餘框架的優勢,而且把本身的主要領域定義在了微小項目上。同時,它是可擴展的,Flask讓開發者本身選擇用什麼數據庫插件存儲他們的數據。不少功能簡單但性能卓越的網站就是基於Flask框架而搭建的,好比http://httpbin.org/就是一個功能簡單但性能強大的HTTP測試項目。Flask是一個面向簡單需求和小型應用的微框架。
相對於其餘Python語言的Web框架而言,Flask的特色能夠歸結以下。
網絡程序調試是在將編制好的網站投入實際運行前,用手工或編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程。有經驗的開發者都知道,這是保證網站系統可以正式應用的必要步驟。
Flask 自帶的開發服務器使開發者在調試程序時無須再安裝其餘任何網絡服務器,好比Tomcat、JBoss、Apache等。Flask默認處於調試狀態,使得運行中的任何錯誤會同時向兩個目標發送信息:一個是Python Console,即啓動Python程序的控制檯;另外一個是HTTP客戶端,即Flask開發服務器將調試信息傳遞給了客戶端。
單元測試是對最小軟件開發單元的測試,其重點測試程序的內部結構,主要採用白盒測試方法,由開發人員負責。單元測試的主要目標是保證函數在給定的輸入狀態下,可以獲得預想的輸出,在不符合要求時可以提醒開發人員進行檢查。
Flask提供了一個與Python自帶的單元測試框架unitest無縫銜接的測試接口,即Flask對象的test_client()函數。經過test_client()函數,測試程序能夠模擬進行HTTP訪問的客戶端來調用Flask路由處理函數,而且獲取函數的輸出來進行自定義的驗證。
將HTML頁面與後臺應用程序聯繫起來一直是網站程序框架的一個重要目標。Flask經過使用Jinja2模板技術解決了這個問題。Jinja2是一個很是靈活的HTML模板技術,它是從Django模板發展而來的,可是比Django模板使用起來更加自由且更加高效。Jinja2模板使用配製的語義系統,提供靈活的模板繼承技術,自動抗擊XSS跨站攻擊而且易於調試。
WSGI(Web Server Gateway Interface)具備很強的伸縮性且能運行於多線程或多進程環境下,由於Python線程全局鎖的存在,使得WSGI的這個特性相當重要。WSGI已是Python界的一個主要標準,各類大型網路服務器對其都有良好的支持。WSGI位於Web應用程序與Web服務器之間,與WSGI徹底兼容使得Flask可以配置到各類大型網絡服務器中。
Flask是徹底基於Unicode的。這對製做非純ASCII字符集的網站來講很是方便。HTTP自己是基於字節的,也就是說任何編碼格式均可以在HTTP中傳輸。可是,HTTP要求在HTTP Head中顯式地聲明在本次傳輸中所應用的編碼格式。在默認狀況下,Flask會自動添加一個UTF-8編碼格式的HTTP Head,使程序員無須擔憂編碼的問題。
以上講到的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等特性來支持異步編程。
欲進一步瞭解Python四大主流網絡編程框架的編程方法、項目實戰,可參見《Python高效開發實戰——Django、Tornado、Flask、Twisted》一書。--------------------- --------------------- --------------------- --------------------- -----來源:CSDN 原文:https://blog.csdn.net/chenqiuge1984/article/details/80127498