摘要:從的開始分析的源碼很容易可以看出,通過繼承類定義自己的處理類,來處理請求。類的對象來處理的路由將于處理類組成,關(guān)聯(lián)起來。調(diào)用的來將和綁定在一起初始化一個(gè)的對象,由其來處理請求的路由,來利用建立的規(guī)則。
從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,關(guān)聯(lián)起來)。
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()
參數(shù)handlers是一個(gè)list,list里每個(gè)object是一個(gè)URLSpec的對象或tuple。tuple可以是二到四個(gè)element,分別是URI的正則、handler類、用于初始化URLSpec的kwargs、handler的name。
(下面add_handlers詳細(xì)說明)
參數(shù)settings是一個(gè)dict,所有settings的具體用法
初始化transforms(HTTP傳輸壓縮等,默認(rèn)GZipContentEncoding 和 ChunkedTransferEncoding 。也可以自己實(shí)現(xiàn),需要實(shí)現(xiàn) transform_first_chunk 和 transform_chunk 接口,RequestHandler 中的 flush 調(diào)用,剖析RequestHandler時(shí)詳細(xì)介紹),UI模塊
通過settings的值來初始化靜態(tài)文件處理Handler,包括:
static_path
static_url_prefix
static_handler_class
static_handler_args
static_hash_cache
初始化其他settings
調(diào)用add_handlers方法添加handlers。
加載自動(dòng)重新加載模塊(當(dāng)檢測到代碼被修改后重構(gòu)啟動(dòng))
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的時(shí)候的第一個(gè)參數(shù)存的tuple是用來初始化URLSpec的所以參數(shù)順序應(yīng)該和URLSpec要求的一樣(def __init__(self, pattern, handler, kwargs=None, name=None))。
用過第四個(gè)參數(shù)name來構(gòu)造反響代理,儲(chǔ)存在Application的named_handlers(dict)里。
hello world里調(diào)用了Application的listen和tornado.ioloop.IOLoop.instance().start()(以后會(huì)詳細(xì)介紹ioloop),來真正啟動(dòng)。
三、listenpythondef listen(self, port, address="", **kwargs): from tornado.httpserver import HTTPServer server = HTTPServer(self, **kwargs) server.listen(port, address)
實(shí)例化一個(gè)HTTPServer,將application綁定上去。HTTPServer調(diào)用application的start_request來將application和connection綁定在一起初始化一個(gè)_RequestDispatcher的對象,由其來處理請求的路由,來利用add_handler建立的規(guī)則。
原文連接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37486.html
摘要:對參數(shù)類型進(jìn)行檢驗(yàn),這里為當(dāng)參數(shù)類型不合適是會(huì)拋出一個(gè)異常。將使用的第二個(gè)參數(shù)值作為默認(rèn)值。而請求將從格式中取得指定的文本。這里需要正則表達(dá)式相關(guān)的知識(shí),到了后面的學(xué)習(xí)中,必要時(shí)再去深入學(xué)習(xí)。到目前我們使用了,還支持任何合法的請求。 參考書籍《Introduction to Tornado》1.1 Tornado是什么?Tornado是使用Python編寫的一個(gè)強(qiáng)大的、可擴(kuò)展的Web服...
摘要:而這里的方法則是告訴來讀取模板文件,并將結(jié)果返回給瀏覽器。依舊可以使用,等條件控制語句,但是要記得以結(jié)尾。替換字符串中的字符為編碼形式。模塊模塊是封裝模板中包含的標(biāo)記樣式以及行為的可復(fù)用組件。 表單和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...
摘要:首先是的請求接著是的請求在本次分享中,我們介紹了的請求,包括請求,并將介紹如何使用和來測試該本次分享到此結(jié)束,歡迎大家交流 ??Tornado是現(xiàn)在的主流 Web 服務(wù)器框架,它與大多數(shù) Python 的框架有著明顯的區(qū)別:它是非阻塞式服務(wù)器,而且速度相當(dāng)快。得利于其非阻塞的方式和對 epoll 的運(yùn)用,Tornado 每秒可以處理數(shù)以千計(jì)的連接,這意味著對于實(shí)時(shí) Web 服務(wù)來說,T...
摘要:這是我重新復(fù)習(xí)的原因放棄了之前自己實(shí)現(xiàn)的全面擁抱的這個(gè)改動(dòng)是非常大的而且閱讀的源碼可以發(fā)現(xiàn)其中大部分函數(shù)都支持了類型檢驗(yàn)和返回值提示值得閱讀 廢話不多說,直接上代碼 __auth__ = aleimu __doc__ = 學(xué)習(xí)tornado6.0+ 版本與python3.7+ import time import asyncio import tornado.gen import t...
摘要:也就是說用于設(shè)定與處理類間的映射關(guān)系。在中,默認(rèn)使用和函數(shù)分別處理兩種請求。因?yàn)楸韱稳蕴峤坏疆?dāng)前頁面,所以還是由處理。載入時(shí)間相關(guān)的的一個(gè)類,獲取當(dāng)前時(shí)間戳。獲取數(shù)據(jù)庫中的名為的。 前面的話 Demo1是一個(gè)簡單的博客系統(tǒng)(=。=什么網(wǎng)站都叫系統(tǒng))。我們從這個(gè)簡單的系統(tǒng)入手,去了解P+T+M網(wǎng)站的內(nèi)部邏輯,并記住一些規(guī)則,方便我們進(jìn)一步自己開發(fā)。 規(guī)則這個(gè)詞特意打上了雙引號,目的是...
閱讀 2322·2023-04-26 00:01
閱讀 809·2021-10-27 14:13
閱讀 1840·2021-09-02 15:11
閱讀 3393·2019-08-29 12:52
閱讀 542·2019-08-26 12:00
閱讀 2574·2019-08-26 10:57
閱讀 3416·2019-08-26 10:32
閱讀 2859·2019-08-23 18:29