摘要:從的開始分析的源碼很容易可以看出,通過繼承類定義自己的處理類,來處理請求。類的對象來處理的路由將于處理類組成,關聯起來。調用的來將和綁定在一起初始化一個的對象,由其來處理請求的路由,來利用建立的規則。
從tornado的 Hello,world 開始分析tornado的源碼
pythonimport tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
很容易可以看出,通過繼承RequestHandler類定義自己的處理類,來處理請求。Application類的對象來處理URI的路由(將URIr"/"于處理類MainHandler組成tuple,關聯起來)。
tornado.web.Application類 一、__init__簡化版代碼:
pythondef __init__(self, handlers=None, default_host="", transforms=None, **settings): if transforms is None: self.transforms = [] if settings.get("compress_response") or settings.get("gzip"): self.transforms.append(GZipContentEncoding) else: self.transforms = transforms ...... self.ui_modules = {"linkify": _linkify, "xsrf_form_html": _xsrf_form_html, "Template": TemplateModule, } self.ui_methods = {} self._load_ui_modules(settings.get("ui_modules", {})) self._load_ui_methods(settings.get("ui_methods", {})) if self.settings.get("static_path"): ...... if handlers: self.add_handlers(".*$", handlers) if self.settings.get("debug"): self.settings.setdefault("autoreload", True) ...... # Automatically reload modified modules if self.settings.get("autoreload"): from tornado import autoreload autoreload.start()
參數handlers是一個list,list里每個object是一個URLSpec的對象或tuple。tuple可以是二到四個element,分別是URI的正則、handler類、用于初始化URLSpec的kwargs、handler的name。
(下面add_handlers詳細說明)
參數settings是一個dict,所有settings的具體用法
初始化transforms(HTTP傳輸壓縮等,默認GZipContentEncoding 和 ChunkedTransferEncoding 。也可以自己實現,需要實現 transform_first_chunk 和 transform_chunk 接口,RequestHandler 中的 flush 調用,剖析RequestHandler時詳細介紹),UI模塊
通過settings的值來初始化靜態文件處理Handler,包括:
static_path
static_url_prefix
static_handler_class
static_handler_args
static_hash_cache
初始化其他settings
調用add_handlers方法添加handlers。
加載自動重新加載模塊(當檢測到代碼被修改后重構啟動)
pythondef add_handlers(self, host_pattern, host_handlers): if not host_pattern.endswith("$"): host_pattern += "$" handlers = [] if self.handlers and self.handlers[-1][0].pattern == ".*$": self.handlers.insert(-1, (re.compile(host_pattern), handlers)) else: self.handlers.append((re.compile(host_pattern), handlers)) for spec in host_handlers: if isinstance(spec, (tuple, list)): assert len(spec) in (2, 3, 4) spec = URLSpec(*spec) handlers.append(spec) if spec.name: if spec.name in self.named_handlers: app_log.warning( "Multiple handlers named %s; replacing previous value", spec.name) self.named_handlers[spec.name] = spec
將host_pattern和handlers,組成tuple加到self.handlers的末尾但是在匹配所有域名的tuple前。
由spec = URLSpec(*spec)易看出初始化Application的時候的第一個參數存的tuple是用來初始化URLSpec的所以參數順序應該和URLSpec要求的一樣(def __init__(self, pattern, handler, kwargs=None, name=None))。
用過第四個參數name來構造反響代理,儲存在Application的named_handlers(dict)里。
hello world里調用了Application的listen和tornado.ioloop.IOLoop.instance().start()(以后會詳細介紹ioloop),來真正啟動。
三、listenpythondef listen(self, port, address="", **kwargs): from tornado.httpserver import HTTPServer server = HTTPServer(self, **kwargs) server.listen(port, address)
實例化一個HTTPServer,將application綁定上去。HTTPServer調用application的start_request來將application和connection綁定在一起初始化一個_RequestDispatcher的對象,由其來處理請求的路由,來利用add_handler建立的規則。
原文連接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37486.html
摘要:對參數類型進行檢驗,這里為當參數類型不合適是會拋出一個異常。將使用的第二個參數值作為默認值。而請求將從格式中取得指定的文本。這里需要正則表達式相關的知識,到了后面的學習中,必要時再去深入學習。到目前我們使用了,還支持任何合法的請求。 參考書籍《Introduction to Tornado》1.1 Tornado是什么?Tornado是使用Python編寫的一個強大的、可擴展的Web服...
摘要:而這里的方法則是告訴來讀取模板文件,并將結果返回給瀏覽器。依舊可以使用,等條件控制語句,但是要記得以結尾。替換字符串中的字符為編碼形式。模塊模塊是封裝模板中包含的標記樣式以及行為的可復用組件。 表單和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...
摘要:首先是的請求接著是的請求在本次分享中,我們介紹了的請求,包括請求,并將介紹如何使用和來測試該本次分享到此結束,歡迎大家交流 ??Tornado是現在的主流 Web 服務器框架,它與大多數 Python 的框架有著明顯的區別:它是非阻塞式服務器,而且速度相當快。得利于其非阻塞的方式和對 epoll 的運用,Tornado 每秒可以處理數以千計的連接,這意味著對于實時 Web 服務來說,T...
摘要:這是我重新復習的原因放棄了之前自己實現的全面擁抱的這個改動是非常大的而且閱讀的源碼可以發現其中大部分函數都支持了類型檢驗和返回值提示值得閱讀 廢話不多說,直接上代碼 __auth__ = aleimu __doc__ = 學習tornado6.0+ 版本與python3.7+ import time import asyncio import tornado.gen import t...
摘要:也就是說用于設定與處理類間的映射關系。在中,默認使用和函數分別處理兩種請求。因為表單仍提交到當前頁面,所以還是由處理。載入時間相關的的一個類,獲取當前時間戳。獲取數據庫中的名為的。 前面的話 Demo1是一個簡單的博客系統(=。=什么網站都叫系統)。我們從這個簡單的系統入手,去了解P+T+M網站的內部邏輯,并記住一些規則,方便我們進一步自己開發。 規則這個詞特意打上了雙引號,目的是...
閱讀 2291·2023-04-26 00:01
閱讀 796·2021-10-27 14:13
閱讀 1812·2021-09-02 15:11
閱讀 3381·2019-08-29 12:52
閱讀 528·2019-08-26 12:00
閱讀 2569·2019-08-26 10:57
閱讀 3405·2019-08-26 10:32
閱讀 2848·2019-08-23 18:29