[PYTHON] web2py 開發框架介紹

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編程一般遵循如下基本原則:

  • 不重複本身(DRY)。
  • 僅有一種實現方式。
  • 明確比含蓄更好。

在web2py中,經過強制開發者使用可靠成熟的軟件工程實踐,遏制代碼重複,保證徹底遵照前兩條原則。web2py能指導開發者完成幾乎全部web應用開發中的常見任務(建立和處理表單,管理會話,小甜餅「cookie」,錯誤等等)。

web2py對第3個原則的處理與其它框架有所不一樣,有時與前兩個原則相沖突。尤爲是web2py不會導入用戶應用,而是在預約義的狀況下執行。這會暴露Python和web2py關鍵字。

對某些人來講,這看起來就像魔術,但它不是這樣的。簡單地說,在實踐中有些模塊已經自動導入了,而不須要開發者導入。web2py試圖避免其它框架下存在的使人討厭的特徵,即開發者須要在每一個模型和控制器的頂部導入相同的模塊。

web2py經過導入自有模塊節約了時間,避免了錯誤,這遵循了不重複本身和僅有一種實現方式的精髓。

若是開發者想使用其它Python模塊或第三方模塊,這些模塊必須明確導入,就像開發任何其它Python程序同樣。

 

 

在其最基本的層面上,web應用包含了一組程序(或者函數),當用戶訪問相應的URL時,該程序將被執行。同時,程序的輸出返回給用戶,並呈如今瀏覽器中。

web框架是爲了讓開發者更快、更簡便、無差錯的開發新應用。它經過提供API和開發工具,以減小代碼編寫量。

開發web應用的兩個經典方法是:

  • 經過編程生成HTML[html:w,html:o] 代碼。
  • 將代碼嵌入HTML頁面中。

早期的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編輯界面的例子。

 

image

 

web2py中一個請求的典型工做流描述以下:

 

image

 

在圖中:

  • 服務器能夠是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"是模型:
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最初被開發成一種教學工具,最初的開發動機以下:

  • 在不犧牲功能的前提下,方便用戶學習服務器端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標準。

下面是web2py主要管理(admin)界面的截圖:

 

image

 

開放Web應用安全工程[owasp] (OWASP的)是一個自由和開放的全球社區,專一於改善應用軟件的安全性。

OWASP列出了web應用安全方面的十大問題。在這裏給出該列表,並陳述web2py是如何解決這些問題的:

  • 「跨站點腳本攻擊(XSS):當應用獲取用戶提交的數據並返回web瀏覽器時,若是不首先進行驗證或編碼,XSS漏洞就可能出現。XSS容許攻擊者在受害者瀏覽器中執行腳本,從而劫持用戶會話,毀損網站,還可能引入蠕蟲。」在默認狀況下,web2py將會轉意呈如今視圖中的全部變量,防止跨站點腳本攻擊。
  • 「注入攻擊(Injection Flaws):注入攻擊在Web應用中很是廣泛,特別是SQL注入。當用戶提交的數據被做爲命令或查詢的一部分發送到解釋器時,注入攻擊就可能發生。攻擊者的惡意數據欺騙解釋器執行異常的命令或更改數據。」 web2py經過採用數據庫抽象層使得SQL注入攻擊不可能發生。一般狀況下,SQL語句並非由開發人員編寫的,而是由DAL動態生成的,從而確保全部插入的數據都被適當地轉意。
  • 「執行惡意文件」(Malicious File Execution):脆弱的遠程文件包含的代碼(RFI)可能被攻擊者加入惡意代碼和數據,形成毀滅性的攻擊,例如服務器癱瘓。」 web2py只容許運行對外暴露的函數,從而防止惡意文件的執行。導入的函數毫不會被暴露;暴露的僅有行爲(action)。web2py採用了基於WEB的管理接口,使得很是容易跟蹤暴露的行爲。
  • 「不安全的直接對象引用:(Insecure Direct Object Reference):當開發者把內部引用對象,例如文件、目錄、數據庫記錄或密鑰,做爲URL地址或表單的參數時,不安全的直接對象引用攻擊就可能發生。攻擊者可以操控這些引用,在未經受權的狀況下訪問其它對象。」 web2py沒有暴露任何內部對象;此外,web2py還會驗證全部的URL,從而防止目錄遍歷攻擊。web2py還提供了一個使用簡單的機制,以建立自動驗證全部輸入的表單。
  • 「跨站點請求僞造(Cross Site Request Forgery):CSRF攻擊迫使一個已經登陸的受害者的瀏覽器,向脆弱的網絡應用發送一個預先驗證的請求,該請求又迫使受害者的瀏覽器執行有利於攻擊者的敵意行爲。web應用有多強大,CSRF就有多強大。」 web2py經過在表單中加入一次性隨機令牌,防止CSRF攻擊和偶然的表單重複提交。另外web2py對會話cookie使用了UUID。
  • 「信息泄露和錯誤處理不當(Information Leakage and Improper Error Handling):應用可能無心中泄露它們的配置、內部運做的信息,或者在各類應用中侵犯隱私。攻擊者能夠經過該缺陷竊取得到敏感數據或發起更嚴重的攻擊。」 web2py中包含一個票據系統。任何錯誤都不會致使代碼暴露給用戶。全部的錯誤都被記錄,框架會發送一個票據給用戶,用來進行錯誤追蹤。只有系統管理員才能訪問錯誤和源代碼。
  • 「驗證和會話管理中斷(Broken Authentication and Session Management):用戶帳戶信息和會話令牌經常沒有被妥善加以保護。攻擊者經過獲取用戶密碼、密鑰或者驗證令牌冒用其它用戶的身份。」 web2py提供了內置的管理員驗證機制,它能爲每個應用獨立地管理會話。當客戶端不是"localhost"時,管理接口也可以強制使用安全的會話cookie。對於應用來講,web2py框架提供了功能強大的基於角色的接入控制API。
  • 「不安全加密存儲(Insecure Cryptographic Storage):Web應用程序不多使用合理的加密算法保護數據和憑證。攻擊者利用加密不足的數據進行身份盜用和其它犯罪,例如信用卡詐騙。」 web2py使用MD5或HMAC+SHA-512哈希算法來保護用戶存儲的密碼。固然,也能夠採用其它算法。
  • 「不安全通訊(Insecure Communications):當須要保護敏感通訊時,應用經常不能加密網絡數據流。」 web2py包含支持SSL[ssl]的Rocket WSGI 服務器,它也能使用Apache或Lighttpd和mod─ssl進行通訊SSL加密。
  • 「未能限制URL訪問」(Failure to Restrict URL Access):應用常常僅僅經過不顯示敏感的連接或URL來阻止未受權用戶,以保護敏感功能。攻擊者正是利用這一漏洞,經過直接接入這些URL來進行未受權的操做。」 web2py將URL請求映射到Python模塊和函數。web2py包含了一套驗證機制,能夠定義那些函數是公有的,那些是須要通過驗證和受權才能訪問的。基於角色的接入控制API容許開發者採用登陸、會員羣或接入許可羣來限制訪問函數。權限是能夠細化的,例如,經過結合CRUD可以讓用戶接入指定的表和/或記錄。基於登陸或組羣權限來限制用戶的訪問。例如,,權限的設置甚至可以細化到哪些用戶可以訪問哪些表和記錄。web2py還支持數字簽名的URL,而且提供了API對ajax回調進行數字簽名。

對web2py的安全性評論,你能夠在參考文獻 [pythonsecurity]中找到評論性結果。

你能夠經過官方網站下載web2py:

1
http://www.web2py.com 

web2py由以下組件構成:

  • 庫(libraries):提供web2py核心功能,可經過編程訪問。
  • web服務器:Rocket WSGI web服務器。
  • 管理(admin)應用:用於建立、設計和管理其它web2py應用。admin提供了一個完整的基於web的集成開發環境(IDE),用於開發web2py應用。它還包括其它功能,如基於web的測試和shell。
  • 示例(examples)應用:包含文檔和交互示例。應用示例是官方網站web2py.com的副本,幷包含epydoc文檔。
  • 歡迎(welcome)應用:是其它應用的基本構建模板。默認時,它包含一個純CSS層疊菜單和用戶認證(在第九章討論)。

web2py以源代碼或二進制形式發行,適用於微軟windows或Mac OS X操做系統。

源代碼發行版能夠在任何支持Python的平臺上運行,而且包含了上述全部組件。爲了運行源代碼,你須要預先安裝Python 2.5。同時,還須要安裝一種支持的數據庫引擎。爲了測試和輕量級需求的應用,你可使用內置於Python 2.5中的SQLite數據庫。

web2py的二進制版本(適用於Windows和Mac OS X)包含Python2.5解釋器和SQLite數據庫。從技術上講,這兩個部分並非web2py的組件。將它們包含在二進制發行版中,是爲了使您可以直接運行web2py。

下圖描繪了web2py的總體結構:

 

 

image

 

下載方法:

web2py:官網http://www.web2py.com/ 

選擇你的系統

 

下載完成後使用方法:

1.打開你的pycharm:關閉當前project

2.open你下載好的web2py的源文件:點擊運行web2python->web2py framework 就出來了 選擇服務器的 ip port 及設置密碼->而後就能夠點擊 start sever啦!

3.而後就能夠開始發揮你的想象了:

 

 還能夠添加你的一些功能,發揮你的想象吧!

 

注:上面部分介紹來自官方

相關文章
相關標籤/搜索