簡單而直接的Python web 架構:web.py

來源:互聯網
上載者:User

轉自:http://www.oschina.net/question/5189_4306

 

web.py 是一個Python 的web 架構,它簡單而且功能強大。web.py 是公開的,無論用於什麼用途都是沒有限制的。

先讓大家感受一下web.py 的簡單而強大:

import web

urls = (
'/(.*)', 'hello'
)

class hello:
def GET(self, name):
i = web.input(times=1)
if not name: name = 'world'
for c in xrange(int(i.times)): print 'Hello,', name+'!'

if __name__ == "__main__": web.run(urls, globals())

看看,上面就是一個基於web.py 的完整的Web 應用程式。不信?!將上面的代碼儲存為檔案code.py,在命令列下執行python code.py。然後開啟你的瀏覽器,開啟地址:http://localhost:8080/RossWan,看看結 果 :)沒有意外的話(當然要先安裝web.py,下面會有介紹),瀏覽器會顯示“Hello, RossWan!”。這是一個最簡單的Hello world Web 應用程式。是不是很簡單?!下面將較為詳細地介紹下web.py 。Find fun

1. 安裝

單擊這裡下載web.py 的安裝檔案,將下載得到的檔案web.py-0.21.tar.gz 解壓,進入解壓後的檔案夾,在命令列下執行:python setup.py install,在Linux 等系統下,需要root 的許可權,可以執行:sudo python setup.py install。

安裝完畢之後,就可以正式開始web.py 之旅…

2. URL 處理

對於一個網站來說,URL 的組織是最重要的一個部分,因為這是使用者看得到的部分,而且直接影響到網站是如何工作的,在著名的網站如:del.icio.us ,其URLs 甚至是網頁介面的一部分。而web.py 以簡單的方式就能夠構造出一個強大的URLs。

在每個web.py 應用,必須先import web 模組:

import web

現在,我們須要告訴web.py URL 如何組織,讓我們以一個簡單例子開始:

urls = (
'/', 'index' )

在上面的例子中,第一部分(‘/’)是一個匹配URL 的Regex,像/,/help/faq,/item/(/d+),等等;第二部分(‘index’)是一個類名,匹配的請求將會被發送過去。

現在,我們需要編寫index 類。當大部人瀏覽網頁的時候,他們都沒有注意到,瀏覽器是通過HTTP 跟World Wide Web 通訊的。通訊的細節不太重要,但要明白一點,使用者是通過URLs(例如 / 或者 /foo?f=1)來請求網頁伺服器完成一定請求的(例如 GET 或者POST)。

GET 是最普遍的方法,用來請求一個頁面。當我們在瀏覽器裡輸入“harvard.edu” 的時候,實際上它是向Web 服務器請求GET ”/“。另一個常見的方法是POST,常用於提交特定類型的表單,例如利用信用卡付費和處理一個訂單。注意,GET URLs 能夠被搜尋引擎索引得到(想像一下Google 嘗試購買你網站上的所用物品)。

在我們的web.py 代碼中。我們清晰區分這兩種方法:

class index:
def GET(self):
print "Hello, world!"

當接收到一個GET 請求時,上面的GET 方法將會被web.py 調用。

好的。現在,我們只需添加最後一行代碼,讓web.py 啟動網頁應用:

if __name__ == "__main__": web.run(urls, globals())

上面告訴web.py 如何配置URLs,以及找尋的類在檔案中的全域命名空間。

整個code.py 檔案的內容如下:

import web

urls = (
'/', 'index' )

class index:
def GET(self):
print "Hello, world!"

if __name__ == "__main__": web.run(urls, globals())

注意到沒有,雖然我說了很多東西,但實際上web 應用的代碼就只得上面的幾行,而且這是一個完整的web.py 應用。在你的命令列下輸入:

$ python code.py
Launching server: http://0.0.0.0:8080/

現在,你的web.py 應用已經啟動了伺服器。通過瀏覽器訪問http://localhost:8080/ 的話,會見到”Hello, world!“。在啟動伺服器的時候,你可以在python code.py 後面添加IP 位址/連接埠 來控制web.py 啟動的伺服器。例如:python code.py 8888。

3. 調試

web.py 本身也提供調試的工具。在最後的“if name …” 代碼前面添加:

web.webapi.internalerror = web.debugerror

並在最後的“if name …” 添加”web.reloader“:

if __name__ == "__main__": web.run(urls, globals(), web.reloader)

上面的代碼會使你在調試的階段得到更多有用的資訊。web.reloader 其實是一個中介軟體,當你在運行時修改了code.py 檔案後,web.reloader 會重新載入code.py 檔案,讓你在瀏覽器上立刻可以看到變化。如何有多何變化的話,還是需要重新啟動伺服器。web.py 也提供web.profiler ,可以輸出有用的資訊,有關每個頁面的每個函數調用的次數,這用助於你改善代碼。

4. 模板

在Python 裡面編寫HTML 程式碼是相當累贅的,而在HTML 裡嵌入Python 代碼則有趣得多。幸運地,web.py 使這過程變得相當容易。

注意:舊版本的web.py 是用Cheetah templates 模板的,你可以繼續使用,但官方已不再提供支援。

在我們的web 應用裡,添加一個新的檔案夾用來組織模板檔案(例如”/templates“)。然後再建立一個HTML 檔案(例如:”index.html“):

<em>Hello</em>, world!

或者,你可以用web.py 的範本語言用編寫這個HTML 檔案:

$def with (name)

$if name:
I just wanted to say <em>hello</em> to $name.
$else:
<em>Hello</em>, world!

注意上面代碼的縮排!

正如你所見的,上面的模板看上去跟這Python 檔案很相似,以def with 語句開始,但在關鍵字前需要添加”$“。

注意:在模板內的變數,如果包含有HTML 標籤,以$ 方式引用變數的話,HTML 標籤只會以純文字的顯示出來。要想HTML 標籤產生效果,可以用$: 引用變數。

現在,回到code.py 檔案,在”import web” 的下一行添加:

render = web.template.render('templates/')

這告訴web.py 在哪裡可以搜尋得到模板目錄。

提示:可在render 調用裡添加cache = False 使得每次訪問頁面時都重載模板。

下面繼續修改code.py 檔案的GET 方法:

def GET(self):
name = 'Bob'
print render.index(name)

上面的”index“ 是模板的名字,”name“ 是傳遞過去的參數。

修改code.py 檔案的urls 變數:

urls=(
'/(.*)', 'index')

上面的“/(.*)” 是一個Regex。

再將GET 方法修改如下:

def GET(self,name):
print render.index(name)

現在,訪問”/“的話,會顯示”Hello, world!“;訪問”/Joe“ 的話,會顯示”I just want to say hello to Joe“。

如果你想學習更多關於web.py templates 的話,可以訪問templetor page。

5. 資料庫

注意:在你開始串連資料庫之前,請先安裝正確的資料庫驅動。例 如,MySQL 使用MySALdb,Postgre 使用psycopg2。

添加以下代碼,則可以正確配置你的資料庫:

web.config.db_parameters = dict(
dbn='postgres',
user='username',
pw='password',
db='dbname'
)

現在,先行在資料庫裡建立一個簡單的表:

CREATE TABLE todo (
id serial primary key,
title text,
created timestamp default now(),
done boolean default 'f'
);

初始化一行:

INSERT INTO todo (title) VALUES ('Learn web.py');

回到code.py,修改GET 方法如下:

def GET(self):
todos = web.select('todo')
print render.index(todos)

修改urls 變數:

urls = (
'/', 'index')

重新編輯index.html 檔案如下:

$def with (todos)
<ul>
$for todo in todos:
<li id="t$todo.id">$todo.title</li>
</ul>

現在,可以訪問”/“,如果顯示”Learn web.py“,則祝賀你成功了!

現在,再讓我們看看如何向資料庫寫入。

在index.html 檔案的尾部添加如下內容:

<form method="post" action="add">
<p>
<input type="text" name="title" />
<input type="submit" value="Add" />
</p>
</form>

修改code.py 檔案的urls 變數如下:

urls = (
'/', 'index',
'/add', 'add'
)

在code.py 裡添加一個類:

class add:
def POST(self):
i = web.input()
n = web.insert('todo', title=i.title)
web.seeother('/')

web.input 使你能夠方便地訪問使用者通過表單提交上來的變數。web.insert 用於向資料庫的 “todo” 表插入資料,並且返回新插入行的ID。web.seeother 用於重轉向到”/“。

提示:對於資料庫的操作,還有web.transact(), web.commit(), web.rollback(),web.update()。

在web.py 裡,還有web.input,web.query 和其它的函數,返回”Storage objects”,可以像字典型類(dictionaries) 的使用。

6. 總結

web.py 的確相當的小巧,應當歸屬於輕量級的web 架構。但這並不影響web.py 的強大,而且使用起來很簡單、很直接。在實際應用上,web.py 更多的是學術上的價值,因為你可以看到更多web 應用的底層,這在當今“抽象得很好”的web 架構上是學不到的 :) 如果想瞭解更多web.py,可以訪問web.py 的官方文檔。

這篇教程到這裡也要結束了,如果你對web.py 有興趣,可以搜尋更多關於web.py 的文檔看看,你一定會發現更酷的東西。Have fun!

標籤: Python web.py 補充話題說明»
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.