tornado簡(jiǎn)單的WEB服務(wù)
在本節(jié)開始前,確認(rèn)你有一定的python基礎(chǔ),并且pycharm和服務(wù)器環(huán)境搭建完畢。
-
本節(jié)目標(biāo),搭建一個(gè)微型的web服務(wù),監(jiān)聽8000端口,如有接收到客戶端的網(wǎng)頁(yè)請(qǐng)求,根據(jù)請(qǐng)求的路徑 返回 對(duì)應(yīng)的信息。
分布來(lái)做:
- 監(jiān)控端口設(shè)置
- 創(chuàng)建web應(yīng)用 , 將請(qǐng)求路徑 和 響應(yīng) 程序 綁定。
- 響應(yīng)程序 編寫。
- 創(chuàng)建web服務(wù)器,添加 web 應(yīng)用 , 監(jiān)聽 端口, 開啟事件處理。
端口設(shè)置
-
監(jiān)聽端口設(shè)置:命令行或是python腳本內(nèi)?如何設(shè)置
我們這里打算使用python程序做web服務(wù)器,那么在linux下就可以用
python web.py &
來(lái)讓進(jìn)程在后臺(tái)執(zhí)行。也或是直接 使用python web.py
讓服務(wù)在前端執(zhí)行,并返回信息,便于 停止程序,并對(duì)web.py腳本 進(jìn)行調(diào)整。- web.py程序運(yùn)行時(shí),必須監(jiān)聽服務(wù)器端口,以便向客戶提供服務(wù)。如果我們將端口,定義在腳本 內(nèi)部,那么,如果想要改動(dòng)監(jiān)聽的端口,我們必須要修改腳本。如果改動(dòng)次數(shù)過(guò)多,非常麻煩。所以在運(yùn)行腳本 時(shí),如果給定監(jiān)聽端口號(hào),就不必再修改內(nèi)部代碼。 命令給定端口號(hào),便于修改監(jiān)聽的端口。
- 但是,有時(shí)命令 不寫端口,那么內(nèi)部,就不知道該 監(jiān)聽 那個(gè)端口。所以,內(nèi)部,還是要寫一個(gè)端口號(hào)。這個(gè)端口號(hào),要求,如果外部命令,沒(méi)有指定監(jiān)聽的端口,就做默認(rèn)監(jiān)聽端口。
-
腳本實(shí)現(xiàn)。
tornado給我們提供了一個(gè)庫(kù)options,這個(gè)庫(kù)可以從外部命令中獲取指定的參數(shù)。這樣,就可以通過(guò)對(duì)象option來(lái)傳遞命令參數(shù)。
options有一個(gè)方法:define,來(lái)設(shè)定字符串默認(rèn)的值。
-
下面是實(shí)現(xiàn)方法:web.py腳本。
#coding=utf-8 import tornado.options from tornado.options import define,options #端口這里我們用port來(lái)表示。比如外部命令:python web.py --port=8000 #那么在腳本內(nèi)部,options對(duì)象會(huì)添加一屬性:options.port=8000 define("port",default=8000,help="run on given port,default 8000",type=int) #這里define 是options庫(kù)里的一個(gè)函數(shù)方法。 #第一個(gè)參數(shù)傳遞設(shè)定的對(duì)象名稱。 #default 表示如果該對(duì)象沒(méi)有值 就以后面的8000作為默認(rèn)值。 #help 表示外部命令調(diào)用幫助時(shí)顯示的信息。如外部命令:python web.py --help #type 表示對(duì)象 值 的屬性,int 為數(shù)字整形。 tornado.options.parse_command_line() #parse_command_line函數(shù)方法,表示根據(jù)命令行的輸入,處理對(duì)應(yīng)的參數(shù)。
創(chuàng)建web應(yīng)用和請(qǐng)求響應(yīng)類
-
web應(yīng)用和web服務(wù)器關(guān)系
一個(gè)web服務(wù)器中可以包含多個(gè)應(yīng)用,每一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)虛擬主機(jī),做路由映射。
-
路由映射
這里做一個(gè)簡(jiǎn)單的路由映射,將對(duì)“/”的訪問(wèn),交由IndexHandler 類來(lái)處理。
-
IndexHandler 類定義。
客戶請(qǐng)求方法:分為八類。常用的是get和post。這里定義get函數(shù),表示處理get請(qǐng)求。
-
代碼實(shí)現(xiàn)如下:
- tornado創(chuàng)建web應(yīng)用,需要利用web庫(kù)的Application 類來(lái)生成對(duì)象。
#coding=utf-8 import tornado.web handlers=[(r"/",IndexHandler)] #定義了路由映射,以元組的形式。IndexHandler 是一個(gè)RequestHandler類。 app = tornado.web.Application( handlers ) #創(chuàng)建web應(yīng)用app,在創(chuàng)建時(shí),需要用參數(shù)handlers指定路由映射。 # 用 default_host 來(lái)指定響應(yīng)的域名,如果沒(méi)有指定 那么用服務(wù)器IP地址做為服務(wù)地址。 # 在客戶機(jī)上,就使用http://主機(jī)ip,來(lái)請(qǐng)求服務(wù)信息。 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write("hello,world!") #tornado.web.RequestHandler 類封裝了客戶請(qǐng)求的頭部信息,這樣繼承后,可以讓IndexHandler 類,得到請(qǐng)求信息,來(lái)響應(yīng)客戶請(qǐng)求。 #重寫get函數(shù)。
創(chuàng)建web服務(wù)器
在上面,我們定義了監(jiān)聽端口,web應(yīng)用。下面,就創(chuàng)建web服務(wù)器,添加web應(yīng)用。綁定端口,開啟循環(huán)監(jiān)聽。
創(chuàng)建web服務(wù),需要用到tornado.httpserver庫(kù)下的HTTPServer類。
循環(huán)事務(wù),需要用 tornado.ioloop庫(kù)下的IOLoop類,做實(shí)例化。
-
代碼如下:
#coding=utf-8 import tornado.httpserver import tornado.ioloop http_server = tornado.httpserver.HTTPSserver(app) http_server.listen(options.port) #綁定端口 tornado.ioloop.instace().start()
完整的代碼如下:此處做一些修改__name__ == __main__
。防止 其它程序 調(diào)用 web.py時(shí)出錯(cuò)。
#coding=utf-8
import tornado.httpserver
import tornado.options
import tornado.web
import tornado.ioloop
from tornado.options import define,options
#定義port,默認(rèn)值
define("port",default=8000,help="run on the given port,default 8000",type=int)
#處理請(qǐng)求類
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write("hello.")
#路由映射
handlers =[(r"/",IndexHandler)]
#當(dāng)該腳本為自動(dòng)調(diào)用時(shí)
if __name__ == "__main__":
tornado.options.parse_command_line() #解析命令行。
#創(chuàng)建web應(yīng)用
app = tornado.web.Application(
handlers
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()