Python簡單輕量級(jí)Web Server模塊Bottle

提示:使用此WEB服務(wù)器模塊需要有基本的HTTP知識(shí)
簡單、輕量級(jí)指的是:上手不難、容易使用、模塊不大還能完成一般Web服務(wù)器的功能。Bottle是Python平臺(tái)的輕量級(jí)Web Server(準(zhǔn)確的說是HTTP Server)模塊,沒有其它依賴庫,支持Post/Get提交數(shù)據(jù)、上傳文件等功能,還支持簡單的網(wǎng)頁模板?;咎幱诔S霉δ芏加校總€(gè)方面都跟專業(yè)有很大差距的情況,所以它的定位就不是取代專業(yè)Web Server的。
Bottle官方網(wǎng)址 bottlepy.org?? 英文文檔全面。配置語法雖多但都不難
我自己拿Bottle是用來代替 tkinter 界面。在Python中如果編寫一個(gè)TK界面,在處理大量列表數(shù)據(jù)時(shí),界面拉伸總需要改來改去的。而且界面越高級(jí),tkinter越繁雜,都不如直接用TCL/TK畫界面再調(diào)用Python了。但這樣處理Python的返回結(jié)果又很麻煩,所以干脆就換Web界面來管理Python程序。Bottle在小局域網(wǎng)幾個(gè)人用沒問題,沒做過負(fù)載測(cè)試(看Bottle源碼,使用的是threading線程)。
Bottle的使用方法跟Java平臺(tái)的JLhttp很像(Java輕量級(jí)Web伺服器),但是我感覺JLhttp在國內(nèi)好像用的人也不多,如果你沒聽說過就把這句忽略吧。
import bottle
@bottle.route('/')
def 首頁():
??? return "Hello World!"
bottle.run(host='localhost', port=8080, debug=True)
解釋一下上面幾段代碼的含義,導(dǎo)入bottle模塊。Bottle使用了@裝飾器語法來進(jìn)行配置,從語法角度來說增加了初學(xué)者的負(fù)擔(dān)(畢竟不像Java注解那么多),但bottle這里很節(jié)省代碼量。
@bottle.route('/') 表示接下來的自定義函數(shù)負(fù)責(zé)處理網(wǎng)站"/"根目錄的請(qǐng)求。網(wǎng)站和HTTP基礎(chǔ)知識(shí)我就不解釋了。
def 首頁():? 自定義函數(shù),函數(shù)名隨意起,懶得寫注釋,我用bottle時(shí)所有的函數(shù)名都是中文寫明用途。
??? return "Hello World!"?? 這里表示返回給網(wǎng)頁的內(nèi)容,正常應(yīng)該是html代碼。
上面三句體現(xiàn)了Bottle的模式:@裝飾器聲明哪些網(wǎng)址(網(wǎng)站路徑)要被處理。緊接的def函數(shù)處理相關(guān)的網(wǎng)址;處理完畢后return結(jié)果。
bottle.run(host='localhost', port=8080, debug=True)? 網(wǎng)站配置完畢后,啟動(dòng)bottle伺服器。
host表示接受的IP地址(localhost表示本機(jī))。port表示綁定的端口。debug表示有問題時(shí)顯示詳細(xì)錯(cuò)誤。
一些使用例子
靜態(tài)網(wǎng)頁
return bottle.static_file('index.html', 靜態(tài)頁所在的文件夾路徑)
靜態(tài)文件自動(dòng)映射
@bottle.route('/<filepath:path>')
def 靜態(tài)文件自動(dòng)映射(filepath):
??? return bottle.static_file(filepath, 文件夾路徑)
這是自動(dòng)映射網(wǎng)頁的靜態(tài)內(nèi)容,比如html網(wǎng)頁、圖片、js腳本和css等等。一般網(wǎng)頁都需要很多靜態(tài)內(nèi)容,如果都像上面那么映射就沒法活了。
特別需要注意的是,如果有其它子目錄映射,根目錄的靜態(tài)文件映射必須放在子目錄映射之后,否則會(huì)攔截子目錄的映射。
接受Post信息
@bottle.route('/posttest', method='POST')
def 接收信息測(cè)試():
??? if not bottle.request.forms.get('postxinxxi'):
??????? return "信息為空!"
@表示在posttest網(wǎng)址上接收網(wǎng)頁發(fā)來的post信息。注意,此時(shí)直接訪問posttest網(wǎng)址是無效的。
POST數(shù)據(jù)通過bottle.request.forms.get('postxinxxi')來取得,本例中網(wǎng)頁端發(fā)來的數(shù)據(jù)ID是postxinxxi。
雙裝飾器,即接受數(shù)據(jù)也可以訪問
@bottle.route('/Ptest')
@bottle.route('/Ptest', method='POST')
def XXXX……
上面提到接收POST數(shù)據(jù)的網(wǎng)址不能直接訪問,如果想要一個(gè)網(wǎng)頁即可以訪問也可以接收數(shù)據(jù),就需要用雙裝飾器。
文件上傳(借用官方例子)
@route('/upload', method='POST')
def 文件上傳并通過后綴擴(kuò)展名驗(yàn)證上傳類型():
??? upload = request.files.get('upload')
??? filename, 后綴擴(kuò)展名 = os.path.splitext(upload.filename)
????if 后綴擴(kuò)展名 not in ('.png','.jpg','.jpeg'):
????????return '上傳文件類型錯(cuò)誤'
??? upload.save(保存文件的路徑bottle自動(dòng)在路徑后追加文件名)
????return '上傳成功'
比官方例子有精簡,突出了上傳部分,獲取上傳內(nèi)容通過request.files.get實(shí)現(xiàn)。其它重點(diǎn)部分都改成中文放在代碼里了,希望你們能看懂。此外關(guān)于request的類型,官方文檔里有詳細(xì)的列表:

網(wǎng)頁模板
bottle.TEMPLATE_PATH = 模板目錄
先需要設(shè)定模板目錄,然后在def自定義函數(shù)中return部分指定模板
return bottle.template('模板文件名,不用寫后綴', zidingyi='自定義的模板字段')
模板部分要細(xì)說有點(diǎn)長,我大概介紹下流程:先創(chuàng)建HTML文件,然后在HTML需要?jiǎng)討B(tài)變換的部分添加{{!zidingyi}}這樣的自定義字段。在Python程序里計(jì)算自定義字段的最終值,并在return時(shí),指定剛才建立的模板文件名,并且把最終值賦值給zidingyi,模板顯示的時(shí)候{{!zidingyi}}那里就會(huì)變成Python給的最終值。
此外模板還支持一部分Python語法,詳細(xì)用法看官方文檔吧。教程是漸進(jìn)式的,每看一部分就可以使用一些功能。
更多的Cookie、插件等內(nèi)容我沒有用到,請(qǐng)去官方文檔查看。文檔雖然不是面面俱到但都是漸進(jìn)式的,而且每部分都配合代碼例子,對(duì)照觀看還是很容易的。