余斌
摘要:Python語(yǔ)言在網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)中占有重要的位置。Bottle是一個(gè)Python網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)微框架。本文以一個(gè)簡(jiǎn)單日志系統(tǒng)為例,介紹了運(yùn)用Bottle開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用基本方法。
關(guān)鍵詞:Python;WSGI;Bottle;網(wǎng)絡(luò);框架1引言
Python是一種完全面向?qū)ο蟮膭?dòng)態(tài)腳本語(yǔ)言。它以強(qiáng)制縮進(jìn)來(lái)區(qū)分程序區(qū)塊,代碼可讀性強(qiáng);采用多種高級(jí)數(shù)據(jù)結(jié)構(gòu),應(yīng)用開(kāi)發(fā)快速高效;擁有豐富、高質(zhì)量的類庫(kù),可滿足各種類型應(yīng)用開(kāi)發(fā)要求。Python作為一種通用程序設(shè)計(jì)語(yǔ)言,常應(yīng)用于網(wǎng)絡(luò)應(yīng)用、科學(xué)計(jì)算、圖像處理等領(lǐng)域。
2Bottle簡(jiǎn)述
隨著互聯(lián)網(wǎng)技術(shù)快速發(fā)展,網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)逐漸成為軟件開(kāi)發(fā)的一個(gè)主流方向。早期開(kāi)發(fā)人員用Python開(kāi)發(fā)CGI程序,必須手動(dòng)處理網(wǎng)絡(luò)協(xié)議解析,頁(yè)面請(qǐng)求響應(yīng)等細(xì)節(jié)。為了簡(jiǎn)化開(kāi)發(fā)過(guò)程,Python定義了Web服務(wù)器網(wǎng)關(guān)接口即WSGI。著名的網(wǎng)絡(luò)應(yīng)用框架有Django,TurboGears,Zope等。它們網(wǎng)絡(luò)應(yīng)用功能全面,在網(wǎng)絡(luò)開(kāi)發(fā)中使用十分便捷。
Bottle是一個(gè)快速,簡(jiǎn)單,輕量級(jí)的網(wǎng)絡(luò)應(yīng)用微框架,它只提供請(qǐng)求映射、頁(yè)面輸出等必要的功能,而給予開(kāi)發(fā)者更高靈活性以選擇其它組件實(shí)現(xiàn)額外的功能。Bottle僅由一個(gè)文件構(gòu)成,并且不依賴于Python標(biāo)準(zhǔn)庫(kù)以外的第三方類庫(kù),保證了該框架的可移植性。Bottle還可以通過(guò)插件的形式支持ORM方式數(shù)據(jù)庫(kù)訪問(wèn),接入其它模板引擎,部署其它符合WSGI標(biāo)準(zhǔn)的WEB服務(wù)器,確保了框架高度可擴(kuò)展性。
3開(kāi)發(fā)實(shí)例
如圖所示,網(wǎng)絡(luò)用戶通過(guò)客戶端向服務(wù)器發(fā)出服務(wù)請(qǐng)求,服務(wù)器根據(jù)請(qǐng)求調(diào)用相應(yīng)的網(wǎng)絡(luò)應(yīng)用程序。網(wǎng)絡(luò)應(yīng)用程序通過(guò)解析請(qǐng)求地址調(diào)用相應(yīng)方法,該方法通過(guò)數(shù)據(jù)庫(kù)訪問(wèn)接口對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,并將操作結(jié)果返回網(wǎng)絡(luò)應(yīng)用程序。網(wǎng)絡(luò)應(yīng)用框架決定以何種方式呈現(xiàn)這些數(shù)據(jù),并通過(guò)WEB服務(wù)器發(fā)往客戶端??蛻舳私邮諗?shù)據(jù),解析HTML代碼,呈現(xiàn)結(jié)果,完成一次完整的服務(wù)請(qǐng)求。結(jié)合網(wǎng)絡(luò)應(yīng)用程序的工作過(guò)程,我們以一個(gè)簡(jiǎn)單日志管理系統(tǒng)開(kāi)發(fā)來(lái)介紹基于Bottle的網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)流程。
3.1 安裝Bottle
從Bottlepy.org下載Bottle源文件,并將該源文件放置于項(xiàng)目所在的目錄即完成安裝。在聯(lián)網(wǎng)情況下,在控制臺(tái)執(zhí)行“easy_install bottle”,亦可自動(dòng)安裝Bottle。
3.2 配置數(shù)據(jù)庫(kù)
在項(xiàng)目目錄下執(zhí)行以下代碼即可創(chuàng)建SQLite3后臺(tái)數(shù)據(jù)庫(kù)。
$ sqlite3 blog.db < blog.sql
3.3 映射URL
網(wǎng)絡(luò)應(yīng)用框架最重要的功能是將瀏覽器對(duì)服務(wù)器地址的請(qǐng)求映射到Python網(wǎng)絡(luò)程序的方法或者對(duì)象上。Bottle利用修飾器@route可靈活配置URL路由。在本應(yīng)用中,@route('/blog')與@route('/blog/page/
3.4 方法實(shí)現(xiàn)
現(xiàn)以一個(gè)簡(jiǎn)單的回調(diào)顯示函數(shù)blog為例說(shuō)明Python對(duì)數(shù)據(jù)庫(kù)的操作。該函數(shù)主要是實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢并在瀏覽器中顯示查詢結(jié)果。主要代碼如下所示。
首先,連接數(shù)據(jù)庫(kù)
conn = sqlite3.connect('blog.db')。
然后,定位數(shù)據(jù)庫(kù)當(dāng)前位置
c = conn.cursor()。
接著,在當(dāng)前位置執(zhí)行sql查詢
c.execute("SELECT * FROM blog " )
最后,獲得查詢結(jié)果
results = c.fetchall()。
將查詢結(jié)果作為參數(shù)傳遞給Bottle的模板對(duì)象template,框架Bottle即可自動(dòng)實(shí)現(xiàn)將查詢結(jié)果轉(zhuǎn)發(fā)到WEB服務(wù)器。
對(duì)數(shù)據(jù)庫(kù)其他操作,如插入,刪除,修改的實(shí)現(xiàn)也都比較類似,在此不再一一贅述。
3.5 瀏覽器輸出
Bottle可通過(guò)template(‘templatename,args)方法來(lái)調(diào)用其內(nèi)建快速簡(jiǎn)潔的模板系統(tǒng),其中templatename為所調(diào)用的模板名,args為給模板傳入的參數(shù)。模板內(nèi)可用%include語(yǔ)句引入其它模板,也可嵌入Python的for循環(huán)與if - else判斷語(yǔ)句。例如,在模板內(nèi)嵌入以下語(yǔ)句,就可將結(jié)果中的每個(gè)項(xiàng)目都輸出到瀏覽器中。
3.6 分頁(yè)顯示
當(dāng)查詢數(shù)據(jù)庫(kù)的結(jié)果較多時(shí),一個(gè)頁(yè)面往往無(wú)法容納所有項(xiàng)目。我們可利用SQLite3分頁(yè)查詢來(lái)實(shí)現(xiàn)較多日志的分頁(yè)顯示。如:SELECT * FROM blog LIMIT 5 OFFSET 0,實(shí)現(xiàn)自第1個(gè)項(xiàng)目開(kāi)始取回5個(gè)項(xiàng)目。
3.7 表單處理
Bottle用request對(duì)象的request.GET.get()方法來(lái)獲得瀏覽器的數(shù)據(jù)。如有多個(gè)參數(shù)需要獲取,則可以多次調(diào)用request.GET.get()方法來(lái)實(shí)現(xiàn),并對(duì)獲取的數(shù)據(jù)可以再進(jìn)行進(jìn)一步的處理。
3.8 其它內(nèi)置工具
Bottle還提供許多內(nèi)置工具,給予程序員在文件上傳,cookies處理,HTTP元數(shù)據(jù)轉(zhuǎn)化功能等方面的許多便利,具體可參考Bottle的API文檔。
4性能測(cè)試
將代碼存儲(chǔ)為一個(gè)Python腳本文件,如app.py,在控制臺(tái)下運(yùn)行該文件,網(wǎng)絡(luò)應(yīng)用程序即完成最簡(jiǎn)單的部署。為檢驗(yàn)網(wǎng)絡(luò)應(yīng)用程序性能,我們采用Apache Benchmark在本機(jī)上對(duì)應(yīng)用進(jìn)行壓力測(cè)試。測(cè)試結(jié)果表明,Bottle內(nèi)置單線程WEB服務(wù)器并發(fā)特性不是很好,而當(dāng)部署專門的WEB服務(wù)器后,其并發(fā)響應(yīng)性能有明顯提升。對(duì)于數(shù)據(jù)庫(kù)訪問(wèn)并發(fā)度高的網(wǎng)絡(luò)應(yīng)用,選用支持并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)如MySQL,PostgreSQL等可提高網(wǎng)絡(luò)應(yīng)用穩(wěn)定性。
5結(jié)論
網(wǎng)絡(luò)應(yīng)用框架作為一種對(duì)網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)的封裝,在實(shí)際開(kāi)發(fā)中大大提高了開(kāi)發(fā)人員的開(kāi)發(fā)效率。通過(guò)一個(gè)日志管理實(shí)例的實(shí)現(xiàn),我們可以看到利用網(wǎng)絡(luò)應(yīng)用框架Bottle構(gòu)建內(nèi)容管理系統(tǒng)等基于數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)應(yīng)用十分快捷高效。實(shí)驗(yàn)表明,Bottle比較適合輕型網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā),在進(jìn)行相應(yīng)擴(kuò)展以后,Bottle也可具有較好的網(wǎng)絡(luò)服務(wù)性能。
[參考文獻(xiàn)]
[1]http://bottlepy.org/docs/dev/index.html.
[2]http://www.python.org.
[3]Magnus Lie Hetland Beginning Python:From Novice to Professional [M].USA:Apress,2008.