成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Tornado源碼閱讀筆記】tornado.web.Application

Cympros / 1416人閱讀

摘要:從的開始分析的源碼很容易可以看出,通過繼承類定義自己的處理類,來處理請求。類的對象來處理的路由將于處理類組成,關(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))

二、add_handle
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的listentornado.ioloop.IOLoop.instance().start()(以后會(huì)詳細(xì)介紹ioloop),來真正啟動(dòng)。

三、listen
pythondef 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

相關(guān)文章

  • Tornado學(xué)習(xí)筆記(1)

    摘要:對參數(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服...

    ChanceWong 評論0 收藏0
  • Tornado學(xué)習(xí)筆記(2)

    摘要:而這里的方法則是告訴來讀取模板文件,并將結(jié)果返回給瀏覽器。依舊可以使用,等條件控制語句,但是要記得以結(jié)尾。替換字符串中的字符為編碼形式。模塊模塊是封裝模板中包含的標(biāo)記樣式以及行為的可復(fù)用組件。 表單和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...

    tianyu 評論0 收藏0
  • tornado學(xué)習(xí)筆記(1)HTTP請求及API測試

    摘要:首先是的請求接著是的請求在本次分享中,我們介紹了的請求,包括請求,并將介紹如何使用和來測試該本次分享到此結(jié)束,歡迎大家交流 ??Tornado是現(xiàn)在的主流 Web 服務(wù)器框架,它與大多數(shù) Python 的框架有著明顯的區(qū)別:它是非阻塞式服務(wù)器,而且速度相當(dāng)快。得利于其非阻塞的方式和對 epoll 的運(yùn)用,Tornado 每秒可以處理數(shù)以千計(jì)的連接,這意味著對于實(shí)時(shí) Web 服務(wù)來說,T...

    EddieChan 評論0 收藏0
  • tornado6與python3.7 異步新姿勢

    摘要:這是我重新復(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...

    maxmin 評論0 收藏0
  • Tornado 簡單入門教程(一)——Demo1

    摘要:也就是說用于設(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è)詞特意打上了雙引號,目的是...

    solocoder 評論0 收藏0

發(fā)表評論

0條評論

Cympros

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<