Reputation: 43
I want to set variables when starting my Tornado webserver, so I tried to override initialize
on my RequestHandler
class. But apparently, initialize
is launched each time a request is made, according to the following code and its output:
#!/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()
stdout:
~ ➤ ./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/
This behavior is the complete contrary to what is written in the doc:
Hook for subclass initialization.
(Meaning it is called at the end of __init__
)
So, does anybody know how to do what I want to ?
Thanks in advance.
Upvotes: 4
Views: 785
Reputation: 5687
It's not contrary to the doc; have a look at the Structure of a Tornado app section. A RequestHandler
object is created for each request.
If you want code to be executed when the app is started only, subclass the Application
class and override __init__
, or just put it in your runserver function.
Upvotes: 5