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