web2py是一種免費的,開源的web開發框架,用於敏捷地開發安全的,數據庫驅動的web應用;web2p採用Python語言編寫,而且可使用Python編程。web2py是一個完整的堆棧框架,也就是說她包含了開發完整功能的web應用所需的全部組件。php
web2py被設計來指導web開發人員遵循良好的軟件工程實踐,如使用模型(Model),視圖(View),控制器(Controller)MVC模式。web2py將數據表達(the model)從數據表示(the view)和應用邏輯及工做流(the controller)中分開。web2py提供的庫能夠幫助開發者分別設計,實施和測試MVC中的每一部分,並能使它們一塊兒工做。html
web2py是爲了安全而構建的。這意味着遵循成熟的方法,他能自動處理不少可能致使安全漏洞的問題。例如web2py驗證全部輸入(防止注入攻擊),轉義全部輸出(防止跨站點腳本攻擊),重命名上傳文件(防止目錄遍歷攻擊)。在與安全有關的方面,web2py沒有留給應用程序開發人員選擇的餘地。mysql
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的數據庫管理接口來訪問數據庫和表。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,這保證了應用程序的後向兼容性。sql
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)
Python編程一般遵循如下基本原則:瀏覽器
在web2py中,經過強制開發者使用可靠成熟的軟件工程實踐,遏制代碼重複,保證徹底遵照前兩條原則。web2py能指導開發者完成幾乎全部web應用開發中的常見任務(建立和處理表單,管理會話,小甜餅「cookie」,錯誤等等)。安全
web2py對第3個原則的處理與其它框架有所不一樣,有時與前兩個原則相沖突。尤爲是web2py不會導入用戶應用,而是在預約義的狀況下執行。這會暴露Python和web2py關鍵字。服務器
對某些人來講,這看起來就像魔術,但它不是這樣的。簡單地說,在實踐中有些模塊已經自動導入了,而不須要開發者導入。web2py試圖避免其它框架下存在的使人討厭的特徵,即開發者須要在每一個模型和控制器的頂部導入相同的模塊。
web2py經過導入自有模塊節約了時間,避免了錯誤,這遵循了不重複本身和僅有一種實現方式的精髓。
若是開發者想使用其它Python模塊或第三方模塊,這些模塊必須明確導入,就像開發任何其它Python程序同樣。
在其最基本的層面上,web應用包含了一組程序(或者函數),當用戶訪問相應的URL時,該程序將被執行。同時,程序的輸出返回給用戶,並呈如今瀏覽器中。
web框架是爲了讓開發者更快,更簡潔,無差錯的開發新應用。它經過提供API和開發工具,以減小代碼的編寫量。
開發web應用的兩個經典方法是:
早期的CGI腳本遵循第一種模型。下列腳本遵循第二種模型,例如PHP[php](代碼用PHP編寫,相似C語言)、ASP(代碼用Visual Basic編寫)以及JSP(代碼用Java編寫)腳本。
這裏舉一個PHP程序的例子,執行時,從數據庫中得到數據,並返回一個顯示選中記錄的HTML頁面。
<html><body><h1>Records</h1><? mysql_connect(localhost,username,password); @mysql_select_db(database) or die( "Unable to select database"); $query="SELECT * FROM contacts"; $result=mysql_query($query); mysql_close(); $i=0; while ($i < mysql_numrows($result)) { $name=mysql_result($result,$i,"name"); $phone=mysql_result($result,$i,"phone"); echo "<b>$name</b><br>Phone:$phone<br /><br /><hr /><br />"; $i++; } ?></body></html>
這種方法的問題在於,程序代碼嵌入到HTML中,可是這個程序在生成額外的HTML的同時,還要生成SQL語句查詢數據庫,應用的不一樣層次交織在一塊兒,代碼變得難以閱讀和難以維護。對於Ajax應用程序,狀況就更糟了,隨着應用頁數(文件)的增長,複雜性也增長。
上述例子的功能,在web2py中可用兩行Python代碼來表達:
def index(): return HTML(BODY(H1('Records'), db().select(db.contacts.ALL)))
在這個簡單的例子中,頁面結構由HTML,BODY和H1對象程序化表示;經過select語句查詢數據庫db;最後,全部結果都被序列化成HTML代碼。注意db不是關鍵字,而是一個用戶定義的變量。爲了不混淆,咱們將始終使用db這一術語來指代數據庫鏈接。
web框架一般分爲兩種類型:一種是「膠水」框架,經過組合(粘合)幾個第三方組件來構造。另外一種是「全功能棧」框架,經過建立特別設計的緊密整合和協做工做的組件來構造。
web2py是一個全堆棧框架。幾乎全部組件都是從頭構建的,並被設計成協同工做,可是這些組件在web2py框架以外一樣能發揮功能。例如,數據庫抽象層(DAL)或模板語言都能獨立於web2py框架使用,只要將gluon.dal或gluon.template導入你的Python應用便可。gluon是包含系統庫的web2py模塊的名稱。一些web2py庫依賴web2py的其它部分,例如,創建和處理來自數據庫表格的表單。web2py也可以同第三方Python庫配合使用,包括其它模板語言和DAL,但它們之間的結合沒有原配組件那麼緊密。
web2py鼓勵開發人員將數據表達(Model),數據表達(View)和應用工做流(Controller)分離。
web2py中一個請求的典型工做流描述以下:
在圖中:
這裏給一個最小的,完整的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是衆多web應用框架中的一種,可是它有引人注目的、獨特的功能。web2py最初被開發成一種教學工具,最初的開發動機以下:
WSGI [wsgi-w,wsgi-o] (Web服務器網關接口)是一種新興的Web服務器和Python應用之間通訊的Python標準。