web2py是一種免費的,開源的web開發框架,用於敏捷地開發安全的,數據庫驅動的web應用;web2p采用Python語言編寫,並且可以使用Python編程。web2py是一個完整的堆棧框架,也就是說她包含了開發完整功能的web應用所需的所有組件。
web2py被設計來指導web開發人員遵循良好的軟件工程實踐,如使用模型(Model),視圖(View),控制器(Controller)MVC模式。web2py將數據表達(the model)從數據表示(the view)和應用邏輯及工作流(the controller)中分開。web2py提供的庫可以幫助開發者分別設計,實施和測試MVC中的每一部分,並能使它們一起工作。
web2py是為了安全而構建的。這意味着遵循成熟的方法,他能自動處理很多可能導致安全漏洞的問題。例如web2py驗證所有輸入(防止注入攻擊),轉義所有輸出(防止跨站點腳本攻擊),重命名上傳文件(防止目錄遍歷攻擊)。在與安全有關的方面,web2py沒有留給應用程序開發人員選擇的余地。
web2py中包含數據庫抽象層(DAL),它能夠動態寫入SQL[sql:w] ,因此開發人員不需要自己寫。DAL知道如何透明地生成支持SQLite[sqlite] ,MySQL[mysql] ,PostgreSQL[postgres] ,MSSQL[mssql] ,FireBird[firebird] , Oracle[oracle] ,IBM DB2[db2] ,Informix[informix] 以及Ingres[ingresdb] 的SQL語句。當在谷歌App Engine (GAE)[gae]上運行時,DAL也能生成函數調用Google Datastore。實驗時,我們支持更多的數據庫。請查看web2py網站和郵件列表,獲取最新的支持。一旦有一個或多個數據庫表被定義,web2py也能生成一個全功能的基於web的數據庫管理接口來訪問數據庫和表。
web2py與其它web框架的不同之處在於,它是唯一全面支持web2.0范例的框架,在這里web就是計算機。實際上,web2py不需要安裝或配置,它能在任何支持Python的體系結構(Windows,,Windows CE,Mac OS X,iOS ,Unix/Linux)上運行,應用程序的開發、部署和維護可以通過本地或遠程web接口完成。web2py支持CPython(C語言實現)或Jython(Java語言實現),雖然官方聲稱僅支持2.5版本,但實際支持的版本包括2.4,2.5,2.6,2.7,這保證了應用程序的后向兼容性。
web2py提供了一個票據系統。如果出現錯誤,系統會發出一個票據給用戶,並記錄錯誤信息供管理員查看。
下面給出一些web2py語句的例子來展示它的功能和簡潔性。代碼如下:
db=DAL("mysql://root:Free-Wi11@10.0.20.252:3306/mybatis")
db.define_table('users',Field('id'),Field('name'),Field('age'),primarykey=['id'],migrate=False)
web框架通常分為兩種類型:一種是“膠水”框架,通過組合(粘合)幾個第三方組件來構造。另一種是“全功能棧”框架,通過創建特別設計的緊密整合和協作工作的組件來構造。
web2py是一個全堆棧框架。幾乎所有組件都是從頭構建的,並被設計成協同工作,但是這些組件在web2py框架之外同樣能發揮功能。例如,數據庫抽象層(DAL)或模板語言都能獨立於web2py框架使用,只要將gluon.dal或gluon.template導入你的Python應用即可。gluon是包含系統庫的web2py模塊的名稱。一些web2py庫依賴web2py的其它部分,例如,建立和處理來自數據庫表格的表單。web2py也能夠同第三方Python庫配合使用,包括其它模板語言和DAL,但它們之間的結合沒有原配組件那么緊密。
模型-視圖-控制器(Model-View-Controller)
web2py鼓勵開發人員將數據表達(Model),數據表達(View)和應用工作流(Controller)分離。
web2py中一個請求的典型工作流描述如下:
在圖中:
- 服務器可以是web2py內置服務器或第三方服務器,例如Apache。服務器可以處理多線程。
- "main"是主要的WSGI應用。它負責處理所有常見任務和封裝用戶應用。它處理cookies、sessions、transactions、URL地址解析及反向地址解析和分發。如果web服務器沒有處理的話,它能服務和流靜態文件。
- Model、View、Controller組件構成了用戶應用。
- 同一個web2py實例可以承載多個應用。
- 虛線箭頭表示與數據庫引擎的通信。數據庫查詢可以使用SQL語言(不推薦)或使用web2py DAL語言(推薦),這樣web2py應用代碼不依賴於特定數據庫引擎。
- 分發器將請求的URL映射成控制器中的函數調用。函數的輸出可以是字符串或符號字典(哈希表)。字典中的數據將被呈現成視圖。如果用戶請求HTML頁面(默認情況),字典將被呈現成HTML頁面。如果用戶以XML請求同一頁面,web2py將會嘗試找到一個能將字典呈現成XML格式的視圖。開發人員可以創建視圖將頁面呈現成任何已經支持的協議(HTML、XML、JSON、RSS、CSV、RTF)或者另外的自定義協議。
- 所有的調用都被封裝到一個事務(transaction)之中,並且任何未捕獲到的異常都將導致事務回滾。如果請求成功,事務將被提交。
- web2py還能自動處理sessions和session cookies,並且當事務被提交的時候,相應的session也被保存,除非有另有指明。
- 還能注冊經常性的任務(通過cron)以定時和/或在特定的任務完成(action)之后執行。用這種方式將可能在后台運行耗時長的、計算量大的任務,而不影響用戶瀏覽。
這里給一個最小的,完整的MVC應用,它由3個文件組成:
“db.py”是模型:
db=DAL("mysql://root:Free-Wi11@10.0.20.252:3306/mybatis") db.define_table('users',Field('id'),Field('name'),Field('age'),primarykey=['id'],migrate=False)
它連接數據庫(在本例中是指存儲在10.0.20.252中的mysql數據庫)並定義了一個名為users的表,如果該表不存在,web2py將在后台透明的創建它,並生成適用於特定數據庫引擎的sql語句。
當表格被定義並創建好之后,web2py還會生成一個功能完整的基於web的數據庫管理界面,該界面稱作appadmin,通過它訪問數據庫和表。
”default.py”是控制器:
def users(): grid=SQLFORM.grid(db.users,user_signature=False) return locals()
在web2py中,URL被映射成Python模塊和函數調用。在本例中,控制器僅包含一個名為contracts的函數(或“action”)。Action可能返回字符串(返回的網頁)或Python字典(一組對應的鍵和值)或一組局部變量(如同本例)。如果函數返回字典,它將被傳送給視圖,該視圖與控制器/函數同名,並返回一個網頁。在本例中,函數contacts生成一個表db.user的選擇(select)/搜索(search)/創建(create)/更新(update)/刪除(delete)網格,並將該網格返回給視圖。
“default/users.html”是視圖
{{extend 'layout.html'}} <h1>users records</h1> {{=grid}}
界面顯示:
數據庫中的記錄:
文件目錄:
為什么選擇web2py
web2py是眾多web應用框架中的一種,但是它有引人注目的、獨特的功能。web2py最初被開發成一種教學工具,最初的開發動機如下:
- 在不犧牲功能的前提下,方便用戶學習服務器端web開發。為此,web2py被設計成無需安裝、無需配置,無依賴性(除了源代碼的發行版要求Python2.5和它的標准庫模塊外),絕大部分功能可以通過Web接口訪問。
- web2py從剛推出起一直到今天都保持穩定,因為它遵循自上而下的設計原則,即在它被編寫以前所有編程接口(API)都已經被設計好。甚至加入了新功能,它的后向兼容性也不會被破壞。即便將來增加了新功能,也能實現兼容。
- web2py前瞻性地解決許多重要的安全問題,這些問題困擾着許多現代Web應用,將在下面開放Web軟件安全工程[owasp]中介紹。
- web2py是輕量級的。其核心庫,包括數據庫抽象層、模板語言和所有幫助對象加在一起只有1.4MB。整個源代碼包括示例應用和圖像在內,也只有10.4MB。
- web2py占用資源少,運行速度快。它使用由Timothy Farrell開發的Rocket[rocket] WSGI服務器。它與采用mod_wsgi的Apache一樣快。我們的測試表明,在一台普通的PC上,不訪問數據庫的動態網頁平均響應時間大約10ms。DAL開銷小,通常小於3%。
- web2py在模塊、控制器和視圖中采用Python句法,但並不導入模塊和控制器(其余Python框架采用導入方式),而是去執行它們。這意味着不必重啟web服務器即可進行應用的安裝、卸載和修改,不同的應用可以共存而不會導致模塊的互相干擾。
- web2py使用數據庫抽象層取代對象關系映射(ORM)。從概念角度來說,這意味着不同的數據庫表被映射成不同的Table類實例,而不是不同的類,同時記錄被映射成Row類的實例,而不是相應的Table類的實例。從實用的角度來看,這意味着SQL句法與DAL句法幾乎一一對應,DAL在引擎蓋下沒有復雜的元類(metaclass)編程,這與流行的ORM不同,復雜的編程將增加延遲。
WSGI [wsgi-w,wsgi-o] (Web服務器網關接口)是一種新興的Web服務器和Python應用之間通信的Python標准。