web2py[web2py] 是一種免費的、開源的web開發框架,用於敏捷地開發安全的、數據庫驅動的web應用;web2py採用Python[python] 語言編寫,而且可使用Python編程。web2py是一個完整的堆棧框架,也就是說它包含了開發完整功能的web應用所需的全部組件。php
web2py被設計來指導web開發人員遵循良好的軟件工程實踐,如使用模型(Model)、視圖(View)、控制器(Controller)(MVC)模式。web2py將數據表達(the model)從數據表示(the view)和應用邏輯及工做流(the controller)中分開。web2py提供的庫能夠幫助開發者分別設計、實施和測試MVC中的每一部分,並能使它們一塊兒工做。html
web2py是爲了安全而構建的。這意味着遵循成熟的方法,它能自動處理許多可能致使安全漏洞的問題。例如,web2py驗證全部輸入(防止注入攻擊),轉義全部輸出(防止跨站點腳本攻擊),重命名上傳文件(防止目錄遍歷攻擊)。在與安全有關的方面,web2py沒有留給應用程序開發人員選擇的餘地。python
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的數據庫管理接口來訪問數據庫和表。mysql
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,這保證了應用程序的後向兼容性。jquery
web2py提供了一個票據系統。若是出現錯誤,系統會發出一個票據給用戶,並記錄錯誤信息供管理員查看。web
web2py是開源的,在LGPL版本3許可證下發布。ajax
web2py的另外一個特色是開發者承諾在將來版本中保持後向兼容性。從2007年10月web2py首次發佈至今,咱們一直都是這樣作的。儘管web2py增長了新功能,修復了錯誤,然而若是一個程序在web2py1.0上能運行,那麼它如今還能運行。算法
下面給出一些web2py語句的例子來展現它的功能和簡潔性。代碼以下:sql
1 |
db.define_table('person', Field('name'), Field('image', 'upload'))
|
以上代碼建立了一個「person」數據庫表,該表包含兩個字段,即」name」字符串和」image」, image是須要上傳的圖片(實際圖片)。若是該表已經存在,可是與上述定義不匹配,則該表將會被妥善更改。shell
給定上述定義表,代碼以下:
1 |
form = crud.create(db.person)
|
建立了一個插入表單,該表容許用戶上傳圖片。它還會驗證提交的表單,以安全的方式重命名上傳的圖片,並將圖片存儲到文件中。同時,向數據庫中插入相應記錄,以防止重複提交。若是用戶提交的數據未能經過驗證,將經過添加錯誤信息來修改表單。
代碼以下:
1 2 |
@auth.requires_permission('read','person') def f(): ....
|
上述代碼將阻止訪問者進入函數f,除非訪問者所在的組有權限讀取」person」中的記錄。若是訪問者未登陸,他將被定向到登錄頁面(由web2py默認提供)。
下面的代碼將嵌入頁面組件:
1 |
{{=LOAD('other_controller','function.load',ajax=True, ajax_trap=True)}}
|
上述代碼指示web2py以視圖形式加載其它控制函數生成的內容(適用於任何函數)。它經過Ajax加載內容,並將內容嵌入當前網頁(使用當前佈局而不是其它控制函數佈局),這樣就能捕獲加載內容中的全部表單,這樣不須要從新加載網頁也能經過Ajax提交表單。它也能LOAD非web2py應用的內容。
LOAD幫助對象容許應用程序的模塊化設計;本書最後一章將對此進行論述。
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頁面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<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代碼來表達:
1 2 |
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應用。下面是一個web2py MVC編輯界面的例子。
web2py中一個請求的典型工做流描述以下:
在圖中:
這裏給出一個最小的、完整的MVC應用,它由3個文件組成:
"db.py"是模型:
1 2 3 4 |
db = DAL('sqlite://storage.sqlite') db.define_table('contact', Field('name'), Field('phone'))
|
它鏈接數據庫(在本例中是指存儲在storage.sqlite文件中的一個SQLite數據庫),並定義了一個名爲contact的表。若是該表不存在,web2py將在後臺透明的建立它,並生成適用於特定數據庫引擎的SQL語句。開發人員能夠看到生成的SQL,若是用MySQL、PostgreSQL、MSSQL、FireBird、Oracle、DB二、Informix、Interbase、Ingres或谷歌App Engine(SQl和NoSQL)數據庫代替默認數據庫SQLite,就不須要修改數據庫後臺的代碼。
當表格被定義並建立好以後,web2py還會生成一個功能完整的基於web的數據庫管理界面,該界面稱做appadmin,經過它訪問數據庫和表。
"default.py"是控制器:
1 2 3 |
def contacts(): grid=SQLFORM.grid(db.contact, user_signature=False) return locals()
|
在web2py中,URL被映射成Python模塊和函數調用。在本例中,控制器僅包含一個名爲contacts的函數(或「action」)。Action可能返回字符串(返回的網頁)或Python字典(一組對應的鍵和值)或一組局部變量(如同本例)。若是函數返回字典,它將被傳送給視圖,該視圖與控制器/函數同名,並返回一個網頁。在本例中,函數contacts 生成一個表db.contact的選擇(select)/搜索(search)/建立(create)/更新(update)/刪除(delete)網格,並將該網格返回給視圖。
"default/contacts.html"是視圖。
1 2 3 |
{{extend 'layout.html'}} <h1>Manage My Contacts</h1> {{=grid}}
|
在相應的控制器函數(action)被執行後,web2py會自動調用視圖。該視圖的做用是將返回字典中的變量呈現成HTML。視圖文件是用HTML語言編寫的,並用分隔符{{and}}分隔嵌入的Python代碼。這徹底不一樣於PHP代碼,由於嵌入到HTML中的碼是「表示層」碼。"layout.html"文件由web2py提供,並在視圖文件的開始被引用,該文件構成了全部web2py應用的基本佈局。該佈局文件能夠很容易地被修改或替換。
web2py是衆多web應用框架中的一種,可是它有引人注目的、獨特的功能。web2py最初被開發成一種教學工具,最初的開發動機以下:
WSGI [wsgi-w,wsgi-o] (Web服務器網關接口)是一種新興的Web服務器和Python應用之間通訊的Python標準。
下面是web2py主要管理(admin)界面的截圖:
開放Web應用安全工程[owasp] (OWASP的)是一個自由和開放的全球社區,專一於改善應用軟件的安全性。
OWASP列出了web應用安全方面的十大問題。在這裏給出該列表,並陳述web2py是如何解決這些問題的:
對web2py的安全性評論,你能夠在參考文獻 [pythonsecurity]中找到評論性結果。
你能夠經過官方網站下載web2py:
1 |
http://www.web2py.com
|
web2py由以下組件構成:
web2py以源代碼或二進制形式發行,適用於微軟windows或Mac OS X操做系統。
源代碼發行版能夠在任何支持Python的平臺上運行,而且包含了上述全部組件。爲了運行源代碼,你須要預先安裝Python 2.5。同時,還須要安裝一種支持的數據庫引擎。爲了測試和輕量級需求的應用,你可使用內置於Python 2.5中的SQLite數據庫。
web2py的二進制版本(適用於Windows和Mac OS X)包含Python2.5解釋器和SQLite數據庫。從技術上講,這兩個部分並非web2py的組件。將它們包含在二進制發行版中,是爲了使您可以直接運行web2py。
下圖描繪了web2py的總體結構:
下載方法:
web2py:官網http://www.web2py.com/
選擇你的系統
下載完成後使用方法:
1.打開你的pycharm:關閉當前project
2.open你下載好的web2py的源文件:點擊運行web2python->web2py framework 就出來了 選擇服務器的 ip port 及設置密碼->而後就能夠點擊 start sever啦!
3.而後就能夠開始發揮你的想象了:
還能夠添加你的一些功能,發揮你的想象吧!
注:上面部分介紹來自官方