Pycharm創建web2py項目並簡單鏈接MySQL數據庫

引言

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

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

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

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

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

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

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

Web框架

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

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

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

  • 經過編程生成HTML代碼
  • 將代碼嵌入HTML頁面中

早期的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,但它們之間的結合沒有原配組件那麼緊密。

模型-視圖-控制器(Model-View-Controller)

web2py鼓勵開發人員將數據表達(Model),數據表達(View)和應用工做流(Controller)分離。

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」是模型:

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標準。

相關文章
相關標籤/搜索