tornado settings想到的

今天有足够多的时间来看看Tornado中RequestHandler和Application这两个类的关系。

昨天想要调用settings中的内容,找了好半天不知道怎么在handler中使用settings,后来一点一点试出来了,哈哈。比如一个类:

class HelloHandler(tornado.web.RequestHandler):

  def get(self):

    path = self.application.settings["static_path"]
    self.write(path)
    self.finish()

由此我们知道tornado.web.Application是作为参数传入到了tornado.web.RequestHandler中。去看一下源代码先

class RequestHandler(object):
    
    。。。
    def __init__(self, application, request, **kwargs):
        super(RequestHandler, self).__init__()

        self.application = application
        self.request = request 
        。。。

而tornado.web.Application同样有着指向RequestHandler的指针(可以这么理解的)。

让我们继续看看IOloop这个类是如何工作的。

地一个方法绝对就是instance(cls)这个类方法。

@classmethod
def instance(cls):
    if not hasattr(cls,"_instance")
        _instance = cls()
    return _instance

我想在这里再次说一下实例方法,类方法和静态方法的区别:

首先实例方法和类方法,是有一个特别的参数的,self或者cls,当然这不是关键字我们可以使用其他的来代替。当一个实例即使调用了类方法,这个方法的第一参数传入的仍为类。

而如果一个类调用了实例方法那是会报错的。

这个instance是一个类似单例的一个模式。返回一个IOloop的实例。调用start()方法将底层的mulitplex模型跑起来,正是这种模型才能保证tornado有着很高的处理效率。这里重点看一下是如何与http_server相关联起来的。可是代码找了半天根本没有提到httpserver'的事情只是不断的在update events然后再对event进行处理。

我们来到httpserver .py这里看看这里是否有和ioloop有关的代码。可以看到在httpserver中是import ioloop,并且在start()方法中调用了instance方法。可是在demo中的helloworld并没有瞧见有谁调用了httpserver的start()方法。在继续找……  在httpserver中的listen函数中发现自己调用了自己的start方法,这样就齐了。

我们开始看一下helloworld中的main方法。

application = tornado.web.Application([
        (r"/", MainHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application) //这里对handler进行注册
    http_server.listen(options.port) //这里启动了httpserver
    tornado.ioloop.IOLoop.instance().start() //这里启动了ioloop

在httpserver的start方法中也可以看出httpserver收集来的事件将会传递给ioloop进行处理。未完……

原文地址:https://www.cnblogs.com/yujinghui/p/4093738.html