tornado源码学习-web.py

还是从helloworld里,application = tornado.web.Application([(r"/", MainHandler),]),然后看类Application。 参数 transforms用于头信息的定义,列表存储处理类名。ChunkedTransferEncoding,GZipContentEncoding继承自OutputTransform,可以实例化类的时候传入参数transforms,想gzip的启用可以使用setting,例如:settings = {'gzip': True}传入settings参数。 handlers列表,元素为(regexp, request_class)元祖。 settings,还可以设置static_path来标明静态文件访问路径,static_url_prefix标明访问前缀,没有默认设置"/static/"。给添加静态文件访问路由。最后合并参数中 的handlers。这里有一个StaticFileHandler类,等会儿看。 再往下是否载入自动更新模块,通过settings中debug设置。autoreload最最后再看吧。。初始化结束 方法 add_handlers。添加路由协议。983行,self.handlers[-1][0].pattern这里开始没看懂,后来看了re的文档才知道,这里几个变量也容易搞混,不易看懂。self.handlers只能通过,add_handlers进行添加。所以在__init__里面执行add_handlers的时候,self.handlers为空列表。983行 if self.handlers and self.handlers[-1][0].pattern == '.*$':判断只会执行if self.handlers。而当后来进行add_handlers的时候,self.handlers不为空,后面self.handlers[-1][0]类型为正则匹配的类型(我也不知道具体啥名,用type为SRE_Pattern与文档的不一样),可以使用.pattern返回匹配用的字符串进行比较。 这里的功能是为了让‘.*$’匹配放到规则的最下边,这个匹配是域名匹配,路径匹配在handlers,是一个列表,可变对象。在往下就是想handers列表中添加匹配规则,类型URLSpec。具体格式可以打印,先看看类URLSpec。再往下是添加named_handlers,用来通过reverse_url方法,使用name返回匹配的url路径,这个name也是在URLSpec。 URLSpec中self._path, self._group_count的用处现在还不清楚,其他几个上边都有介绍。self._path是把url路径中所有要匹配的替换成%s。self._group_count需要匹配 的数量。reverse方法就是将args带入到self._path。 UIModule类 定义同一类页面的显示。现在还没看到在哪里初始化和使用,Application中_load_ui_methods,_load_ui_modules通过settings设置对应的属性。 _get_host_handlers,__call__在我看完RequestHandler类之后再看,还有web.py其他的类一起。 通过修改helloworl打印一些信息,帮助理解代码:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import os.path

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def main():
    tornado.options.parse_command_line()
    settings = {'gzip': True, 'debug': True,
                'static_path': os.path.join(os.path.dirname(__file__), "static"),
                }
    application = tornado.web.Application([
        (r"/", MainHandler),
    ], **settings)
    print application.transforms
    print repr(application.handlers)
    h = application.handlers[0][0]
    print h.pattern
    for i in application.handlers[0][1]:
        print i.regex.pattern, i.handler_class

    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply