白话 Tornado 源码(2):待请求阶段
admin
2023-07-30 22:33:55
0

上篇《白话 Tornado 源码(1):一个脚本引发的血案》用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码。

概述

(配图超大,请点击这里看大图)

上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分:

  • 启动程序阶段,又称为待请求阶段(上图1、2所有系列和3.0)
  • 接收并处理客户端请求阶段(上图3系列)

简而言之:

1、在启动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestHandler,从而让XXRequestHandler来处理指定url发送的请求);第二步,创建服务器socket对象并添加到epoll中;第三步,创建无线循环去监听epoll。

2、在接收并处理请求阶段,第一步,接收客户端socket发送的请求(socket.accept);第二步,从请求中获取请求头信息,再然后根据请求头中的请求url去匹配某个XXRequestHandler;第三步,匹配成功的XXRequestHandler处理请求;第四步,将处理后的请求发送给客户端;第五步,关闭客户端socket。

本篇的内容主要剖析【启动程序阶段】,下面我们就来一步一步的剖析整个过程,在此阶段主要是有下面重点标注的三个方法来实现。

1234567891011121314 import tornado.ioloopimport tornado.web class MainHandler(tornado.web.RequestHandler):    def get(self):        self.write(\”Hello, world\”) application = tornado.web.Application([    (r\”/index\”, MainHandler),]) if __name__ == \”__main__\”:    application.listen(8888)    tornado.ioloop.IOLoop.instance().start()

 一、application = tornado.web.Application([(xxx,xxx)])

执行Application类的构造函数,并传入一个列表类型的参数,这个列表里保存的是url规则和对应的处理类,即:当客户端的请求url可以配置这个规则时,那么该请求就交由对应的Handler去执行。

注意:

  • Handler泛指继承自RequestHandler的所有类
  • Handlers泛指继承自RequestHandler的所有类的集合

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 class Application(object):    def __init__(self, handlers=None, default_host=\”\”, transforms=None,wsgi=False, **settings):        #设置响应的编码和返回方式,对应的http相应头:Content-Encoding和Transfer-Encoding        #Content-Encoding:gzip 表示对数据进行压缩,然后再返回给用户,从而减少流量的传输。        #Transfer-Encoding:chunck 表示数据的传送方式通过一块一块的传输。        if transforms is None:            self.transforms = []            if settings.get(\”gzip\”):                self.transforms.append(GZipContentEncoding)            self.transforms.append(ChunkedTransferEncoding)        else:            self.transforms = transforms        #将参数赋值为类的变量        self.handlers = []        self.named_handlers = {}        self.default_host = default_host        self.settings = settings        #ui_modules和ui_methods用于在模版语言中扩展自定义输出        #这里将tornado内置的ui_modules和ui_methods添加到类的成员变量self.ui_modules和self.ui_methods中        self.ui_modules = {\’linkify\’: _linkify,                           \’xsrf_form_html\’: _xsrf_form_html,                           \’Template\’: TemplateModule,                           }        self.ui_methods = {}        self._wsgi = wsgi        #获取获取用户自定义的ui_modules和ui_methods,并将他们添加到之前创建的成员变量self.ui_modules和self.ui_methods中        self._load_ui_modules(settings.get(\”ui_modules\”, {}))        self._load_ui_methods(settings.get(\”ui_methods\”, {}))         #设置静态文件路径,设置方式则是通过正则表达式匹配url,让StaticFileHandler来处理匹配的url        if self.settings.get(\”static_path\”):            #从settings中读取key为static_path的值,用于设置静态文件路径            path = self.settings[\”static_path\”]            #获取参数中传入的handlers,如果空则设置为空列表            handlers = list(handlers or [])            #静态文件前缀,默认是/static/            static_url_prefix = settings.get(\”static_url_prefix\”,\”/static/\”)            #在参数中传入的handlers前再添加三个映射:            #【/static/.*】            –>  StaticFileHandler            #【/(favicon\\.ico)】    –>  StaticFileHandler其源码。

概述

(配图超大,请点击这里看大图)

上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分:

  • 启动程序阶段,又称为待请求阶段(上图1、2所有系列和3.0)
  • 接收并处理客户端请求阶段(上图3系列)

简而言之:

1、在启动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestHandler,从而让XXRequestHandler来处理指定url发送的请求);第二步,创建服务器socket对象并添加到epoll中;第三步,创建无线循环去监听epoll。

2、在接收并处理请求阶段,第一步,接收客户端socket发送的请求(socket.accept);第二步,从请求中获取请求头信息,再然后根据请求头中的请求url去匹配某个XXRequestHandler;第三步,匹配成功的XXRequestHandler处理请求;第四步,将处理后的请求发送给客户端;第五步,关闭客户端socket。

本篇的内容主要剖析【启动程序阶段】,下面我们就来一步一步的剖析整个过程,在此阶段主要是有下面重点标注的三个方法来实现。

1234567891011121314 import tornado.ioloopimport tornado.web class MainHandler(tornado.web.RequestHandler):    def get(self):        self.write(\”Hello, world\”) application = tornado.web.Application([    (r\”/index\”, MainHandler),]) if __name__ == \”__main__\”:    application.listen(8888)    tornado.ioloop.IOLoop.instance().start()

 一、application = tornado.web.Application([(xxx,xxx)])

执行Application类的构造函数,并传入一个列表类型的参数,这个列表里保存的是url规则和对应的处理类,即:当客户端的请求url可以配置这个规则时,那么该请求就交由对应的Handler去执行。

注意:

  • Handler泛指继承自RequestHandler的所有类
  • Handlers泛指继承自RequestHandler的所有类的集合

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 class Application(object):    def __init__(self, handlers=None, default_host=\”\”, transforms=None,wsgi=False, **settings):        #设置响应的编码和返回方式,对应的http相应头:Content-Encoding和Transfer-Encoding        #Content-Encoding:gzip 表示对数据进行压缩,然后再返回给用户,从而减少流量的传输。        #Transfer-Encoding:chunck 表示数据的传送方式通过一块一块的传输。        if transforms is None:            self.transforms = []            if settings.get(\”gzip\”):                self.transforms.append(GZipContentEncoding)            self.transforms.append(ChunkedTransferEncoding)        else:            self.transforms = transforms        #将参数赋值为类的变量        self.handlers = []        self.named_handlers = {}        self.default_host = default_host        self.settings = settings        #ui_modules和ui_methods用于在模版语言中扩展自定义输出        #这里将tornado内置的ui_modules和ui_methods添加到类的成员变量self.ui_modules和self.ui_methods中        self.ui_modules = {\’linkify\’: _linkify,                           \’xsrf_form_html\’: _xsrf_form_html,                           \’Template\’: TemplateModule,                           }        self.ui_methods = {}        self._wsgi = wsgi        #获取获取用户自定义的ui_modules和ui_methods,并将他们添加到之前创建的成员变量self.ui_modules和self.ui_methods中        self._load_ui_modules(settings.get(\”ui_modules\”, {}))        self._load_ui_methods(settings.get(\”ui_methods\”, {}))         #设置静态文件路径,设置方式则是通过正则表达式匹配url,让StaticFileHandler来处理匹配的url        if self.settings.get(\”static_path\”):            #从settings中读取key为static_path的值,用于设置静态文件路径            path = self.settings[\”static_path\”]            #获取参数中传入的handlers,如果空则设置为空列表            handlers = list(handlers or [])            #静态文件前缀,默认是/static/            static_url_prefix = settings.get(\”static_url_prefix\”,\”/static/\”)            #在参数中传入的handlers前再添加三个映射:            

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...