-
Tornado介紹
Tornado 是一個Python web框架和異步網絡庫 起初由 FriendFeed 開發. 通過使用非阻塞網絡I/O, Tornado 可以支持上萬級的連接,處理 長連接, WebSockets, 和其他 需要與每個用戶保持長久連接的應用.
Tornado 大體上可以被分爲4個主要的部分:
- web框架 (包括創建web應用的 RequestHandler 類,還有很多其他支持的類).
- HTTP的客戶端和服務端實現 (HTTPServer and AsyncHTTPClient).
- 異步網絡庫 (IOLoop and IOStream), 爲HTTP組件提供構建模塊,也可以用來實現其他協議.
- 協程庫 (tornado.gen) 允許異步代碼寫的更直接而不用鏈式回調的方式.
Tornado web 框架和HTTP server 一起爲 WSGI 提供了一個全棧式的選擇. 在WSGI容器 (WSGIAdapter) 中使用Tornado web框架或者使用Tornado HTTP server 作爲一個其他WSGI框架(WSGIContainer)的容器,這樣的組合方式都是有侷限性的. 爲了充分利用Tornado的特性,你需要一起使用Tornado的web框架和HTTP server.
-
安裝
pip install tornado
-
Tornado web應用的結構
通常一個Tornado web應用包括一個或者多個 RequestHandler 子類, 一個可以將收到的請求路由到對應handler的 Application 對象,和 一個啓動服務的 main() 函數.
-
Application 對象
- Application 對象是負責全局配置的, 包括映射請求轉發給處理程序的路由 表.
路由表是 URLSpec 對象(或元組)的列表, 其中每個都包含(至少)一個正則 表達式和一個處理類. 順序問題; 第一個匹配的規則會被使用. 如果正則表達 式包含捕獲組, 這些組會被作爲 路徑參數 傳遞給處理函數的HTTP方法. 如果一個字典作爲 URLSpec 的第三個參數被傳遞, 它會作爲 初始參數 傳遞給 RequestHandler.initialize. 最後 URLSpec 可能有一個名字 , 這將允許它被 RequestHandler.reverse_url 使用.
- Application 對象是負責全局配置的, 包括映射請求轉發給處理程序的路由 表.
-
RequestHandler 子類
- Tornado web 應用程序的大部分工作是在 RequestHandler 子類下完成的. 處理子類的主入口點是一個命名爲處理HTTP方法的函數: get(), post(), 等等. 每個處理程序可以定義一個或者多個這種方法來處理不同 的HTTP動作. 如上所述, 這些方法將被匹配路由規則的捕獲組對應的參數調用.
- 在處理程序中, 調用方法如 RequestHandler.render 或者 RequestHandler.write 產生一個響應. render() 通過名字加載一個 Template 並使用給定的參數渲染它. write() 被用於非模板基礎的輸 出; 它接受字符串, 字節, 和字典(字典會被編碼成JSON).
- 在 RequestHandler 中的很多方法的設計是爲了在子類中複寫和在整個應用 中使用. 常用的方法是定義一個 BaseHandler 類, 複寫一些方法例如 write_error 和 get_current_user 然後子類繼承使用你自己的 BaseHandler 而不是 RequestHandler 在你所有具體的處理程序中.
-
hello world”案例:
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world。你好世界!!!") class Index(tornado.web.RequestHandler): def get(self): self.write("這是一個首頁") class Redirect(tornado.web.RequestHandler): def get(self): '''重定向''' # self.redirect(r"/") # 重定向到根目錄 self.redirect(r"http://baidu.com") # 重定向到百度 class Error(tornado.web.RequestHandler): def get(self): '''設置網頁狀態500''' self.set_status(500) # 頁面返回500狀態 class Pic(tornado.web.RequestHandler): def get(self): '''圖片''' self.write('<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1688631197,3554659657&fm=27&gp=0.jpg">') def make_app(): ''' tornado.web.Application([(網址1),(網址2)]) 根據路徑修改網址內容 debug=True 報告異常信息 write_error(參數1:錯誤頁,參數2:錯誤異常提示消息) 異常處理 set_status(狀態信息) 設置響應狀態信息 redirect() 重定向處理 get_current_user() 獲取用戶信息進行用戶驗證 異步處理: 方式一:裝飾器 方式二:異步調用 ''' return tornado.web.Application([ (r"/", MainHandler), (r"/index", Index), (r"/redirect", Redirect), (r"/error", Error), (r"/pic", Pic), ], debug=True) #'debug=True 作用:代碼有更新時 自動重啓 if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
-
運行上面代碼 訪問如圖地址
可以看見會根據Application裏定義的路徑調用路徑