2014-11-22 3 views
2

Я хочу установить переменные при запуске веб-сервера Tornado, поэтому я попытался переопределить initialize на моем RequestHandler классе. Но, видимо, initialize запускается каждый раз, когда делается запрос, в соответствии со следующим кодом и его выход:Как не вызвать инициализацию при каждом запросе с помощью Tornado

#!/usr/bin/env python3 
# -*- coding: UTF-8 -*- 

import tornado.web 

class MainHandler(tornado.web.RequestHandler): 
    def initialize(self): 
     print("Launching initialization...") 

    def get(self): 
     print("Get: {}{}".format(self.request.host, self.request.uri)) 

app = tornado.web.Application([= 
    (r"/.*", MainHandler) 
]) 

def runserver(): 
    import tornado.ioloop 

    app.listen(8080) 
    tornado.ioloop.IOLoop.instance().start() 

if __name__ == "__main__": 
    runserver() 

стандартный вывод:

~ ➤ ./redirector.py 
Launching initialization... 
Get: 127.0.0.1:8080/ 
Launching initialization... 
Get: 127.0.0.1:8080/favicon.ico 
Launching initialization... 
Get: 127.0.0.1:8080/favicon.ico 
Launching initialization... 
Get: 127.0.0.1:8080/ 

Такое поведение является полная противоположность тому, что написано в doc:

Крючок для инициализации подкласса.

(Значение это называется в конце __init__)

Итак, кто-нибудь знает, как сделать то, что я хочу?

Заранее спасибо.

ответ

3

Это не противоречит документу; посмотрите раздел Structure of a Tornado app. Для каждого запроса создается объект RequestHandler.

Если вы хотите, чтобы код выполнялся только при запуске приложения, подкласс класса Application и переопределить __init__ или просто поместить его в свою функцию запуска.

Смежные вопросы