When running Tornado web server, we must doing restart for every changes that has been maded. This tedious works for sure. Are you newbie? Yes, I just download Tornado just today and I’m a new comers for this web-framework. If you follow Tornado documentation, it only showing how to running webserver in non-autoreload way. Wait, did you mean Tornado actually have module or function to make it autoreload everytime changes has been made? Yes!
Here is example how to using tornado.autoreload to reload server everytime changes has been made. It’s also “update” if files in templates (HTML) being changed as well.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import os import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import tornado.autoreload from sqlalchemy.orm import scoped_session, sessionmaker from models import engine import logging from urls import URLS tornado.options.define("port", default=8000, help="Run on port", type=int) tornado.options.define("environment", default="dev", help="environment") class Application(tornado.web.Application): def __init__(self): debug = (tornado.options.options.environment == "dev") # Set settings settings = dict( static_path = os.path.join(os.path.dirname(__file__), "static"), template_path = os.path.join(os.path.dirname(__file__), "templates"), xsrf_cookies = True, autoescape = None, session_age = 7 * 24 * 60 * 60, ) # Watch templates for (path, dirs, files) in os.walk(settings["template_path"]): for item in files: tornado.autoreload.watch(os.path.join(path, item)) # Set URL handlers handlers = URLS tornado.web.Application.__init__(self, handlers, **settings) # global database connection self.db = scoped_session(sessionmaker(bind=engine)) def main(): tornado.options.parse_command_line() logging.info("Starting tornado server on 0.0.0.0:%d" % tornado.options.options.port) server = tornado.httpserver.HTTPServer(request_callback=Application(), xheaders=True) server.listen(tornado.options.options.port) io_loop = tornado.ioloop.IOLoop.instance() tornado.autoreload.start(io_loop) io_loop.start() if __name__ == "__main__": main() |
The key here located in this parts:
1. Watch on all files inside templates
1 2 3 4 | # Watch templates for (path, dirs, files) in os.walk(settings["template_path"]): for item in files: tornado.autoreload.watch(os.path.join(path, item)) |
2. IOLoop using autoreload
1 2 3 | io_loop = tornado.ioloop.IOLoop.instance() tornado.autoreload.start(io_loop) io_loop.start() |
Now, when you’re running your server, everytime changes happen, it’s will restart automatically.