还是从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()
上一篇: vim配置python版编辑器
下一篇: ubuntu下vim两个小问题
0 Responses so far.