tornado-04簡(jiǎn)單的web服務(wù)

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)做:

    1. 監(jiān)控端口設(shè)置
    2. 創(chuàng)建web應(yīng)用 , 將請(qǐng)求路徑 和 響應(yīng) 程序 綁定。
    3. 響應(yīng)程序 編寫。
    4. 創(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • 官方文檔中文文檔Tornado概覽淺談Python Web 框架:Django, Twisted, Tornado...
    一只寫程序的猿閱讀 42,233評(píng)論 7 50
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,237評(píng)論 22 257
  • tornado框架是一款相較于其他web framework處理服務(wù)器性能問(wèn)題更加強(qiáng)健的輕量級(jí)的強(qiáng)大的Pytho...
    惡人未滿閱讀 7,192評(píng)論 3 10
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,971評(píng)論 6 342