輕量級(jí)Python web 框架:web.py

From:https://www.oschina.net/question/5189_4306

Web.py github 地址:https://github.com/webpy/webpyhttps://pypi.python.org/pypi/web.py

Web.py Cookbook 簡(jiǎn)體中文版:http://webpy.org/cookbook/index.zh-cn

web.py 0.3 新手指南:http://webpy.org/docs/0.3/tutorial.zh-cn

webpy 官網(wǎng)文檔:http://webpy.org/

web.py 十分鐘創(chuàng)建簡(jiǎn)易博客:http://blog.csdn.net/freeking101/article/details/53020728

一個(gè)簡(jiǎn)單的web.py論壇:http://www.cnblogs.com/russellluo/p/3240564.html


web.py 是一個(gè)Python 的web 框架尊剔,它簡(jiǎn)單而且功能強(qiáng)大。web.py 是公開(kāi)的,無(wú)論用于什么用途都是沒(méi)有限制的卡儒。而且相當(dāng)?shù)男∏啥蓿瑧?yīng)當(dāng)歸屬于輕量級(jí)的web 框架淘菩。但這并不影響web.py 的強(qiáng)大,而且使用起來(lái)很簡(jiǎn)單袍榆、很直接。在實(shí)際應(yīng)用上塘揣,web.py 更多的是學(xué)術(shù)上的價(jià)值包雀,因?yàn)槟憧梢钥吹礁鄔eb 應(yīng)用的底層,這在當(dāng)今“抽象得很好”的web 框架上是學(xué)不到的 :) 如果想了解更多web.py亲铡,可以訪問(wèn)web.py 的官方文檔才写。

先感受一下web.py 的簡(jiǎn)單而強(qiáng)大:



上面就是一個(gè)基于web.py 的完整的Web 應(yīng)用。將上面的代碼保存為文件code.py奖蔓,在命令行下執(zhí)行python code.py赞草。然后打開(kāi)你的瀏覽器,打開(kāi)地址:http://localhost:8080 或者 http://localhost:8080/test?沒(méi)有意外的話(當(dāng)然要先安裝web.py吆鹤,下面會(huì)有介紹)厨疙,瀏覽器會(huì)顯示“Hello, world”或者“Hello, test”。






Linux 下運(yùn)行


這是一個(gè)最簡(jiǎn)單的Hello world Web 應(yīng)用疑务。是不是很簡(jiǎn)單沾凄?!下面將較為詳細(xì)地介紹下web.py 知允。

1. 安裝

下載 web.py 的安裝文件撒蟀,將下載得到的文件 web.py 解壓,進(jìn)入解壓后的文件夾温鸽,在命令行下執(zhí)行:python setup.py install保屯,在Linux 等系統(tǒng)下,需要root 的權(quán)限,可以執(zhí)行:sudo python setup.py install姑尺。

2. URL 處理

對(duì)于一個(gè)站點(diǎn)來(lái)說(shuō)竟终,URL 的組織是最重要的一個(gè)部分,因?yàn)檫@是用戶看得到的部分切蟋,而且直接影響到站點(diǎn)是如何工作的衡楞,例如:www.baidu.com ,其URLs 甚至是網(wǎng)頁(yè)界面的一部分敦姻。而web.py 以簡(jiǎn)單的方式就能夠構(gòu)造出一個(gè)強(qiáng)大的URLs。

在每個(gè)web.py 應(yīng)用歧杏,必須先import web 模塊:

import? web

現(xiàn)在镰惦,我們須要告訴web.py URL 如何組織,讓我們以一個(gè)簡(jiǎn)單例子開(kāi)始:

urls = (

? '/', 'index'? ? )

在上面的例子中犬绒,第一部分是匹配URL的正則表達(dá)式旺入,像/、/help/faq凯力、/item/(\d+)等(\d+將匹配數(shù)字)茵瘾。圓括號(hào)表示捕捉對(duì)應(yīng)的數(shù)據(jù)以便后面使用。第二部分是接受請(qǐng)求的類名稱咐鹤,像index拗秘、view、welcomes.hello(welcomes模塊的hello類)祈惶,或者get_\1雕旨。\1?會(huì)被正則表達(dá)式捕捉到的內(nèi)容替換,剩下來(lái)捕捉的的內(nèi)容將被傳遞到你的函數(shù)中去捧请。(‘index’)是一個(gè)類名凡涩,匹配的請(qǐng)求將會(huì)被發(fā)送過(guò)去。這行表示我們要URL/(首頁(yè))被一個(gè)叫index的類處理疹蛉。

現(xiàn)在我們需要?jiǎng)?chuàng)建一個(gè)列舉這些 url 的 application活箕。

app = web.application(urls, globals())

GET 和 POST : 區(qū)別

現(xiàn)在,我們需要編寫(xiě)index 類可款。當(dāng)大部人瀏覽網(wǎng)頁(yè)的時(shí)候育韩,他們都沒(méi)有注意到,瀏覽器是通過(guò)HTTP 跟World Wide Web 通信的筑舅。通信的細(xì)節(jié)不太重要座慰,但要明白一點(diǎn),用戶是通過(guò)URLs(例如 / 或者 /foo?f=1)來(lái)請(qǐng)求web 服務(wù)器完成一定請(qǐng)求的(例如 GET 或者POST)翠拣。

GET 是最普遍的方法版仔,用來(lái)請(qǐng)求一個(gè)頁(yè)面。當(dāng)我們?cè)跒g覽器里輸入“harvard.edu” 的時(shí)候,實(shí)際上它是向Web 服務(wù)器請(qǐng)求GET ”/“蛮粮。另一個(gè)常見(jiàn)的方法是POST益缎,常用于提交特定類型的表單,比如請(qǐng)求買什么東西然想。每當(dāng)提交一個(gè)去做什么事情(像使用信用卡處理一筆交易)的請(qǐng)求時(shí)莺奔,你可以使用POST。這是關(guān)鍵变泄,因?yàn)镚ET的URL可以明文傳輸提交的參數(shù)令哟。如果提交的是一些重要的敏感信息,例如用戶名妨蛹,密碼屏富,則可能被別人抓包獲取到。而 POST 則不會(huì)在 URL 上傳輸 提交的信息蛙卤,POST 是通過(guò)表單提交信息狠半。

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

class index:

? ? def GET(self):

? ? ? ? print "Hello, world!"

當(dāng)接收到一個(gè)GET 請(qǐng)求時(shí)颤难,上面的GET 方法將會(huì)被web.py 調(diào)用神年。好的。現(xiàn)在行嗤,我們只需添加最后一行代碼已日,讓web.py 啟動(dòng)網(wǎng)頁(yè)應(yīng)用:

if __name__ == "__main__":

? ? app.run()

當(dāng)接收到一個(gè)GET 請(qǐng)求時(shí),上面的GET 方法將會(huì)被web.py 調(diào)用栅屏。好的∥娴校現(xiàn)在,我們只需添加最后一行代碼既琴,讓web.py 啟動(dòng)網(wǎng)頁(yè)應(yīng)用:

if __name__ == "__main__":

? ? app.run()

上面告訴web.py 如何配置URLs占婉,以及找尋的類在文件中的全局命名空間。然后為我們啟動(dòng)上面的應(yīng)用甫恩。

整個(gè) code.py 文件的內(nèi)容如下:



實(shí)際上web 應(yīng)用的代碼就只得上面的幾行逆济,而且這是一個(gè)完整的web.py 應(yīng)用。

3.啟動(dòng)服務(wù)

在你的命令行下輸入:

$ python code.py # 使用默認(rèn)端口 8080

或者

$ python code.py 10000? ? ? ? ? ? ? ? ? ? ? ? # 改變端口為 10000

你的web.py 應(yīng)用已經(jīng)啟動(dòng)了服務(wù)器磺箕。通過(guò)瀏覽器訪問(wèn):http://localhost:8080/?奖慌,會(huì)見(jiàn)到”Hello, world!“松靡。


修改默認(rèn)端口

在啟動(dòng)服務(wù)器的時(shí)候简僧,如果你不想使用默認(rèn)端口,你可以使用這樣的命令來(lái)指定端口號(hào):python code.py 8888雕欺。

4. 調(diào)試

直接添加一行?web.internalerror = web.debugerror 即可岛马。如下

if __name__=="__main__":

? ? web.internalerror = web.debugerror

? ? app.run()


5. 模板

更多關(guān)于 web.py templates 可以訪問(wèn)http://webpy.org/docs/0.3/templetor.zh-cn

在Python 里面編寫(xiě)HTML 代碼是相當(dāng)累贅的棉姐,而在HTML 里嵌入Python 代碼則有趣得多。幸運(yùn)地啦逆,web.py 使這過(guò)程變得相當(dāng)容易伞矩。

注意:舊版本的web.py 是用Cheetah templates模板的,你可以繼續(xù)使用夏志,但官方已不再提供支持乃坤。

新建一個(gè)?code.py?的 python文件。內(nèi)容如下:


使用模板

現(xiàn)在沟蔑,回到 code.py 文件湿诊,在”import web” 的下一行添加:

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

這告訴web.py 在哪里可以搜索得到模板目錄。提示:可在render 調(diào)用里添加cache = False 使得每次訪問(wèn)頁(yè)面時(shí)都重載模板瘦材。

然后再修改使用這個(gè)模板的類枫吧,在這里 ?修改 類 hello_1 和 類?hello_2

class hello_1:

? ? def GET(self):

? ? ? ? return render.index_1()

class hello_2:

? ? def GET(self, name):

? ? ? ? # name = "Lisa"

? ? ? ? return render.index_2("Lisa")

上面的 ”index_1“ 和 “index_2” 是模板的名字,”Lisa“ 是傳遞過(guò)去的參數(shù)宇色。

同時(shí)修改urls為:

urls = (

? ? # '/(.*)', 'hello',

? ? '/hello_1[/]?.*', 'hello_1',

? ? '/hello_2/(.*)', 'hello_2',

)

上面的“/(.*)” 是一個(gè)正則表達(dá)式。括號(hào)里面是要傳遞的參數(shù)颁湖。再將GET 方法修改如下:

def GET(self,name):

? ? print render.index_2(name)

hello_1?頁(yè)面調(diào)用 hello_1 類宣蠕,使用 index_1.html 模板。打開(kāi) http://localhost:8080/hello_1?甥捺,頁(yè)面就會(huì)打印出?Hello, world?的字樣抢蚀。

hello_2/ 頁(yè)面調(diào)用?hello_2 類,使用 index_2.html 模板镰禾,打開(kāi) http://localhost:8080/hello_2/皿曲,頁(yè)面就會(huì)打印出?Hello, Lisa?的字樣。



除此之外還有兩種使用模板的方法

???? 1.使用frender直接指定模板文件吴侦。GET函數(shù)最后兩行改為

render=web.template.frender("templates/index.html")

? return render("Lisa")

?? 2. 直接在代碼里寫(xiě)出模板文件屋休。GET最后兩行改為

template = "$def with (name)\nHello $name"

? render = web.template.Template(template)

? return render("Lisa")

模板含義

現(xiàn)在解釋一下這個(gè) index.html?模板的含義:

$def with (name)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

? ? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

? ? <title>Template</title>

</head>

<body>

? ? Hi, $name

</body>

</html>

在index.html第一行 $def with (name)表示本模板接受一個(gè)名為name的參數(shù),也就是對(duì)應(yīng)index類中return render.index(“Lisa”)中的Lisa备韧。

而render=web.template.render(“templates”)表示創(chuàng)建一個(gè)模板對(duì)象劫樟,模板是存放于templates目錄下,然后就可以用所創(chuàng)建的 render 對(duì)象來(lái)訪問(wèn)相應(yīng)的模板

比如templates目錄下的index.html就是用render.index來(lái)表示(實(shí)際上是匹配尋找index.*文件织堂,第一個(gè)匹配的就認(rèn)為是所對(duì)應(yīng)的模板文件)叠艳,如果templates下還有個(gè)a目錄,a目錄下有個(gè)pagea.html易阳,那么訪問(wèn)這個(gè)pagea模板就要用render.a.pagea的形式了附较。

頁(yè)面參數(shù)

頁(yè)面接收的參數(shù)可以多于一個(gè),也可以沒(méi)有潦俺,如果不需要參數(shù)拒课,則就不需要$def with (name)這樣的代碼徐勃,刪除掉這一句,同時(shí)修改模板中對(duì)name變量的引用捕发,修改index類最后一句為return render.index()就可以了疏旨。

如果有參數(shù),那么模板的第一行代碼就必須是這個(gè) $def with (…)扎酷,可以多于一個(gè)參數(shù)檐涝,比如是這樣$def with (gname, fname)。

模板下面的那行字改為Hi, $gname $fname法挨。

同時(shí)Index類GET返回的時(shí)候賦予對(duì)應(yīng)兩個(gè)參數(shù)return render.index(“Lisa”,”Hayes”)谁榜。

這樣,頁(yè)面最后顯示的是打印出Hi, Lisa Hayes的字樣凡纳。

另外窃植,模板接受的這個(gè)參數(shù)也可以是一個(gè)元組,比如像下面這樣:return render.index((“Lisa”,”Hayes”))

在模板中可以如下以元組方式訪問(wèn)參數(shù)數(shù)據(jù):Hi, $name[0] $name[1]

模板語(yǔ)法

模板語(yǔ)法與python語(yǔ)法基本一致荐糜,主要差別可以從上面的代碼中看到巷怜,要使用到$符號(hào)表明這不是文本而是模板代碼。也就是每當(dāng)用到程序代碼暴氏、對(duì)象的時(shí)候就必須用$來(lái)與html代碼和頁(yè)面顯示文本相區(qū)別延塑。

對(duì)象賦值

向?qū)ο筚x值時(shí)需要在$與對(duì)象名之間留空格,如為一個(gè)名為vara的字符串對(duì)象賦值apple的代碼為$ vara = “apple”答渔。

另外关带,對(duì)象賦值語(yǔ)句必須獨(dú)占一行,前面或后面有其他代碼則會(huì)程序出錯(cuò)沼撕。

對(duì)象引用

引用對(duì)象的時(shí)候直接使用 $+對(duì)象名的形式宋雏,如$vara。

另外引用對(duì)象時(shí)還可以用{}或()將對(duì)象進(jìn)行明確的分組务豺,如$(vara)s就會(huì)表示apples磨总,如果沒(méi)有括號(hào),程序則會(huì)把 $varas作為一個(gè)整體笼沥,也就變成對(duì)varas對(duì)象的引用而發(fā)生錯(cuò)誤舍败。另如果像如下定義兩個(gè)數(shù)字型對(duì)象:

$varb = 1

$varc = 2

然后希望計(jì)算兩個(gè)值的和,如果用$varb+$varc的形式敬拓,頁(yè)面上只會(huì)得到1+2而不是3邻薯,這時(shí)也就需要把兩個(gè)對(duì)象放在括號(hào)里,如$(varb+varc)的形式才能得到正確答案3乘凸。

注釋

模板中支持單行注釋厕诡,以$#符號(hào)開(kāi)始到行末都是注釋內(nèi)容。

$#This is comment

注釋前面可以有其他內(nèi)容营勤,但是不可以有賦值代碼灵嫌。

如下代碼是正確的:Hi $#This is comment

但下面的則會(huì)出錯(cuò):$ vara = “apple” $#This is comment

打印$符號(hào)

由于$符號(hào)在模板中有特殊用途壹罚,所以在頁(yè)面上輸出$時(shí)需要進(jìn)行轉(zhuǎn)義操作,用連續(xù)兩個(gè)$表示在頁(yè)面上輸出一個(gè)$符號(hào)寿羞。

Can you lend me $50?

控制代碼(循環(huán)猖凛、條件判斷)

模板中支持for、while绪穆、if辨泳、elif、else玖院,用法與在python一致菠红,只是控制代碼行要以$開(kāi)始(包括break和continue命令),$開(kāi)始的代碼行中對(duì)象不需要在前面再加$符號(hào)难菌,同時(shí)要注意縮進(jìn)規(guī)則试溯,如:

for 循環(huán):



if else判斷:

$if times > max:

? ? Stop! In the name of love.

$else:

? ? Keep on, you can do it.

在for循環(huán)中,有一組內(nèi)置的變量可以使用郊酒,非常方便遇绞,分別如下所示:

loop.index: 循環(huán)次數(shù)計(jì)數(shù) (1-開(kāi)始)

loop.index0: 循環(huán)次數(shù)計(jì)數(shù)(0-開(kāi)始)

loop.first: 如果是第一次循環(huán)則為T(mén)rue

loop.last: 如果是最后一次循環(huán)則為T(mén)rue

loop.odd: 如果是第奇數(shù)次循環(huán)則為T(mén)rue

loop.even: 如果是第偶數(shù)次循環(huán)則為T(mén)rue

loop.parity: 如果循環(huán)次數(shù)為奇數(shù)值為“odd” ,反之為 “even”

loop.parent: 本循環(huán)的外層循環(huán)對(duì)象


$for a in ["a", "b", "c", "d"]:

? ? $loop.index,$loop.index0,$loop.first,$loop.last,$loop.odd,$loop.even,$loop.parity<br/>

將在頁(yè)面上打印出:

1,0,True,False,True,False,odd2,1,False,False,False,True,even3,2,False,False,True,False,odd4,3,False,True,False,True,even


函數(shù)-$def

函數(shù)定義也是與在python中類似燎窘,用def摹闽,只是也要在前面加$,代碼也要注意$的使用和縮進(jìn):

$def hello(name=""):

Hello $name!

函數(shù)調(diào)用也是用$加函數(shù)名的形式:

$hello("Lisa")

當(dāng)然荠耽,定義函數(shù)時(shí)也可以與html代碼混編:

$def hello(name=""):

Hello $name!

但是調(diào)用的時(shí)候需要在函數(shù)名前用$:前綴,否則html代碼將以plain text形式打印到頁(yè)面上比藻。

$:hello("Lisa")

輸出程序代碼-$code塊

如果想在模板里輸入寫(xiě)一段python代碼而又不想被$所煩惱铝量,那么可以用到$code塊。

頁(yè)面上輸出一段代碼而不希望被系統(tǒng)理解為模板程序代碼银亲,就需要用到$code命令慢叨,比如在模板文件中寫(xiě)入下面一段:

$code:

? ? x=10

? ? def print_num(num):

? ? return "num is %d" % num

然后再加上下面代碼:

$print_num(x)

<br/>

$x

這里就用在$code塊中定義的print_num函數(shù)以x變量為參數(shù)在頁(yè)面上輸出一行:num is 10

然后下一行直接引用x變量,直接在頁(yè)面上輸出數(shù)字10务蝠。

$var

$var命令可以在模板中定義變量拍谐,在其他地方引用此模板對(duì)象的時(shí)候可以訪問(wèn)此定義的變量。

比如我們可以在index.html中添加如下一行:$var vara: this is vara

表示定義了一個(gè)名為vara的變量馏段,變量值是字符串this is vara轩拨。

把index的GET函數(shù)改為:

def GET(self):

? ? render=web.template.render("templates")

? ? return render.index("Lisa", "Hayes").vara

那么結(jié)果顯示在頁(yè)面上的就是this is vara這句話。要注意一點(diǎn)的是院喜,這種變量是字符串亡蓉,即便如下定義變量:$var vara: 0

Vara也并不是數(shù)字0,如果把GET函數(shù)最后改成:return render.index(“Lisa”, “Hayes”).vara+1

會(huì)導(dǎo)致程序出錯(cuò)喷舀。如果希望得到期望中的結(jié)果1砍濒,則需要如下形式代碼:return int(render.index(“Lisa”, “Hayes”).vara)+1

builtins and globals

在模板中淋肾,用戶可以直接使用python的內(nèi)建函數(shù)和變量,寫(xiě)函數(shù)變量包括range, min, max 以及 True 和 False等爸邢。 除此之外樊卓,如果希望在模板中使用其他的非內(nèi)建功能,就需要一點(diǎn)特殊操作杠河。要在創(chuàng)建render的時(shí)候顯式指定所需要的功能函數(shù)碌尔。


import web

import markdown

globals = {'markdown': markdown.markdown}

render =web.template.render('templates', globals=globals)

這樣,在模板中就可以用$markdown來(lái)引用markdown.markdown了感猛。同樣七扰,也可以用這種辦法來(lái)禁用builtins

# disable all builtins

render = web.template.render('templates', builtins={})

模板復(fù)用

當(dāng)多個(gè)頁(yè)面有著相同的結(jié)構(gòu)框架的時(shí)候,為每一個(gè)頁(yè)面單獨(dú)維護(hù)一個(gè)模板就顯得比較麻煩陪白,web.py提供了一種簡(jiǎn)易的解決方法颈走。

這時(shí)候就要用到創(chuàng)建render時(shí)使用base參數(shù):

render=web.template.render("templates",base="layout")

return render.index("Lisa", "Hayes")

這個(gè)layout表示要以templates下的layout.html模板為通用模板框架。因此我們還要在templates目錄下新建一個(gè)layout.html文件咱士,寫(xiě)下如下代碼:

$def with (content)

? ? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

? ? <html xmlns="http://www.w3.org/1999/xhtml">

? ? <head>

? ? ? ? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

? ? ? ? <title>Layout</title>

? ? </head>

? ? <body>

? ? ? ? $:content

? ? </body>

</html>

可以看到立由,這個(gè)模板文件必須是有一個(gè)參數(shù)content。然后修改index.html序厉,只保留如下代碼锐膜,其他刪掉:

$def with(gname, fname)

? ? Hi, $(gname) $(fname)

運(yùn)行程序,頁(yè)面上打印Hi, Lisa Hayes弛房,查看代碼會(huì)發(fā)現(xiàn)最終代碼就是index.html和layout.html合并在一起的結(jié)果道盏,index.html中的內(nèi)容被嵌入到layout.html中的$:content處。

在layout.html模板中還可以引用index.html中定義的var變量文捶,這為程序帶來(lái)了更多的靈活性荷逞,比如我們希望在不同的頁(yè)面在使用同一個(gè)layout模板的時(shí)候能有不同的title,可以在使用layout的模板中定義如下一個(gè)var變量:$var title:This is index.html

然后在layout.html中的title處修改為:$content.title

這樣粹排,訪問(wèn)index.html時(shí)顯示在瀏覽器上的title就是This is index.html种远,而不是原來(lái)的Layout了。

在模板中使用python代碼模塊

在默認(rèn)狀態(tài)下顽耳,在模板中是不能直接調(diào)用其他python代碼模塊文件中的程序的坠敷,必須做一些額外的操作。

首先射富,我們新建一個(gè)模塊膝迎,叫module1.py,在里面寫(xiě)一個(gè)函數(shù):

def hello_from_m1(name=""):

? ? return "hello %s, this is module1" % name

在main.py里導(dǎo)入module1:import module1

并且修改GET函數(shù)中創(chuàng)建render的代碼為:

def GET(self):

? ? render=web.template.render("templates",base="layout",globals={"m1":module1})

? ? return render.index("Lisa")

globals參數(shù)中傳遞的是一個(gè)字典胰耗,key以字符串表示模塊在模板中使用時(shí)的名稱弄抬,value部分就是這個(gè)要在模塊中使用的模塊或?qū)ο蟮恼鎸?shí)名稱了。

最后在要使用此模塊的模板中就可以用$m1來(lái)引用此模塊了宪郊。比如在index.html中添加下面一行代碼:$m1.hello_from_m1(gname)

就會(huì)調(diào)用module1中的hello_from_m1函數(shù)掂恕,在頁(yè)面上打印出:hello Lisa, this is module1

在web.py模板中使用jQuery

在jQuery中$也是一個(gè)關(guān)鍵字拖陆,這樣的話如果在模板中使用jQuery就會(huì)沖突,這時(shí)候只需要用$做一下轉(zhuǎn)義就可以了懊亡,比如:

<script type="text/javascript">

$(document).ready(function()

{

? ? alert("It works.");

});

</script>


6. 數(shù)據(jù)庫(kù)

Web.py 更多關(guān)于數(shù)據(jù)庫(kù)的操作:http://webpy.org/cookbook/index.zh-cn

注意:在你開(kāi)始連接數(shù)據(jù)庫(kù)之前依啰,請(qǐng)先安裝正確的數(shù)據(jù)庫(kù)驅(qū)動(dòng)。比如 MySQLdb店枣、psycopg2速警。如果需要嘗試連接 池(database pool)功能,還得裝下DBUtils鸯两。這幾個(gè)模塊都可以通過(guò)easy_install 或者 pip 來(lái)安裝闷旧。

連接數(shù)據(jù)庫(kù):

import web

db = web.database(dbn='postgres', db='mydata', user='dbuser', pw='')

操作 數(shù)據(jù)庫(kù) 示例

select查詢# 查詢表entries = db.select('mytable')? ? #where條件myvar = dict(name="Bob")results = db.select('mytable', myvar,where="name = $name")results = db.select('mytable',where="id>100")# 查詢具體列results = db.select('mytable', what="id,name")#orderbyresults = db.select('mytable',order="post_date DESC")#groupresults = db.select('mytable',group="color")#limitresults = db.select('mytable',limit=10)#offsetresults = db.select('mytable',offset=10)更新db.update('mytable',where="id = 10", value1 ="foo")刪除db.delete('mytable',where="id=10")復(fù)雜查詢#countresults = db.query("SELECT COUNT(*) AS total_users FROM users")print results[0].total_users#joinresults = db.query("SELECT * FROM entries JOIN users WHERE entries.author_id = users.id")# 防止SQL注入可以這么干results = db.query("SELECT * FROM users WHERE id=$id", vars={'id':10})多數(shù)據(jù)庫(kù)操作 (web.py大于0.3)db1 = web.database(dbn='mysql', db='dbname1',user='foo')db2 = web.database(dbn='mysql', db='dbname2',user='foo')print db1.select('foo',where='id=1')print db2.select('bar',where='id=5')事務(wù)t = db.transaction()try:? ? db.insert('person',name='foo')? ? db.insert('person',name='bar')except:? ? t.rollback()raiseelse:? ? t.commit()# Python2.5+ 可以用withfrom__future__importwith_statementwithdb.transaction():? ? db.insert('person',name='foo')? ? db.insert('person',name='bar')

現(xiàn)在,在數(shù)據(jù)庫(kù)里創(chuàng)建一個(gè)簡(jiǎn)單的表:

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 方法如下:

defGET(self):

todos = db.select('todo')

printrender.index(todos)

修改urls 變量:

urls = (

'/','index')

重新編輯index.html 文件如下:

$defwith(todos)

    $fortodointodos:$todo.title

現(xiàn)在忙灼,可以訪問(wèn)”/“,如果顯示”Learn web.py“钝侠,則祝賀你成功了该园!

現(xiàn)在,再讓我們看看如何向數(shù)據(jù)庫(kù)寫(xiě)入帅韧。在index.html 文件的尾部添加如下內(nèi)容:

<form method="post" action="add">

? <p>

? ? ? <input type="text" name="title" />

? ? ? <input type="submit" value="Add" />

? </p>

</form>

在code.py 里添加一個(gè)類:

class add:

? ? def POST(self):

? ? ? ? i = web.input()

? ? ? ? n = db.insert('todo', title=i.title)

? ? ? ? web.seeother('/')

web.input?使你能夠方便地訪問(wèn)用戶通過(guò)表單提交上來(lái)的變量里初。db.insert?用于向數(shù)據(jù)庫(kù)的 “todo” 表插入數(shù)據(jù),并且返回新插入行的ID忽舟。web.seeother?用于重轉(zhuǎn)向到”/“双妨。

提示:對(duì)于數(shù)據(jù)庫(kù)的操作,還有db.transact()叮阅,?db.commit()刁品,?db.rollback(),db.update()帘饶。

在web.py 里哑诊,還有web.input群扶,web.query?和其它的函數(shù)及刻,返回”Storage objects”,可以像字典型類(dictionaries) 的使用竞阐。

使用 Web.py 搭建一個(gè)測(cè)試網(wǎng)站案例

Web.py Form庫(kù)文檔 和 示例代碼 :http://webpy.org/form

參考http://blog.csdn.net/freeking101/article/details/76148434這篇文章改寫(xiě)成 Web.py 搭建測(cè)試網(wǎng)站

先看 官網(wǎng)一個(gè)使用 Form 表單的示例(code.py):


formtest.html?代碼如下:

$def with (form)

<div align="center">

<form name="main" method="post">

$if not form.valid: <p class="error">Try again, AmeriCAN:</p>

$:form.render()

<input type="submit" />

</form>

<div>

Linux 下運(yùn)行結(jié)果



然后根據(jù)上面內(nèi)容開(kāi)始改寫(xiě) 自己的網(wǎng)站


原文參考:https://blog.csdn.net/freeking101/article/details/53020865

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缴饭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骆莹,更是在濱河造成了極大的恐慌颗搂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幕垦,死亡現(xiàn)場(chǎng)離奇詭異丢氢,居然都是意外死亡傅联,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)疚察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒸走,“玉大人,你說(shuō)我怎么就攤上這事貌嫡”茸ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵岛抄,是天一觀的道長(zhǎng)别惦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)夫椭,這世上最難降的妖魔是什么掸掸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮益楼,結(jié)果婚禮上猾漫,老公的妹妹穿的比我還像新娘。我一直安慰自己感凤,他們只是感情好悯周,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著陪竿,像睡著了一般禽翼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上族跛,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天闰挡,我揣著相機(jī)與錄音,去河邊找鬼礁哄。 笑死长酗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桐绒。 我是一名探鬼主播夺脾,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茉继!你這毒婦竟也來(lái)了咧叭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烁竭,失蹤者是張志新(化名)和其女友劉穎菲茬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婉弹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年睬魂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀赌。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汉买,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佩脊,到底是詐尸還是另有隱情蛙粘,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布威彰,位于F島的核電站出牧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歇盼。R本人自食惡果不足惜舔痕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹缀。 院中可真熱鬧伯复,春花似錦、人聲如沸邢笙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氮惯。三九已至叮雳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妇汗,已是汗流浹背帘不。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杨箭,地道東北人寞焙。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像互婿,于是被迫代替她去往敵國(guó)和親捣郊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停擒悬,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,184評(píng)論 22 257
  • 在 Python 中寫(xiě) HTML 不是聰明的選擇模她,相反在 HTML 中寫(xiě) Python 則有趣的多稻艰。幸運(yùn)的是懂牧,we...
    hxzqlh閱讀 8,167評(píng)論 1 18
  • Web.py 一、Templetor模板對(duì)象 (1)模板系統(tǒng)使用方式 在工程同級(jí)目錄下創(chuàng)建templates文件夾...
    凜0_0閱讀 680評(píng)論 0 0
  • Web框架之Django: (1)簡(jiǎn)介: Django是一個(gè)由Python寫(xiě)成開(kāi)源的重量級(jí)Web應(yīng)用框架,采用MT...
    老肖閱讀 3,057評(píng)論 0 18
  • 《天涼好個(gè)秋》/鳳雅文卿 看盡千篇文抒淚僧凤, 誰(shuí)聞夜挑燭光寒畜侦? 悲涼卻在天涯外, 一籠紗窗月影殘躯保。 《思雨》/鳳雅文...
    鳳雅文卿閱讀 281評(píng)論 0 0