is there a better way to handle index.html with Tornado?

python, tornado

Solution

Turns out that Tornado's StaticFileHandler already includes default filename functionality.

Feature was added in Tornado release 1.2.0: https://github.com/tornadoweb/tornado/commit/638a151d96d681d3bdd6ba5ce5dcf2bd1447959c

To specify a default file name you need to set the "default_filename" parameter as part of the WebStaticFileHandler initialization.

Updating your example:

import os
import tornado.ioloop
import tornado.web

root = os.path.dirname(__file__)
port = 9999

application = tornado.web.Application([
    (r"/(.*)", tornado.web.StaticFileHandler, {"path": root, "default_filename": "index.html"})
])

if __name__ == '__main__':
    application.listen(port)
    tornado.ioloop.IOLoop.instance().start()

This handles root requests:

- `/` -> `/index.html`

sub-directory requests:

- `/tests/` -> `/tests/index.html`

and appears to correctly handle redirects for directories, which is nice:

- `/tests` -> `/tests/index.html`

Problem

I want to know if there is a better way to handle my index.html file with Tornado. I use StaticFileHandler for all the request,and use a specific MainHandler to handle my main request. If I only use StaticFileHandler I got a 403: Forbidden error ``` GET http://localhost:9000/ WARNING:root:403 GET / (127.0.0.1): is not a file ``` here how I doing now: ``` import os import tornado.ioloop import tornado.web from tornado import web __author__ = 'gvincent' root = os.path.dirname(__file__) port = 9999 class MainHandler(tornado.web.RequestHandler): def get(self): try: with open(os.path.join(root, 'index.html')) as f: self.write(f.read()) except IOError as e: self.write("404: Not Found") application = tornado.web.Application([ (r"/", MainHandler), (r"/(.*)", web.StaticFileHandler, dict(path=root)), ]) if __name__ == '__main__': application.listen(port) tornado.ioloop.IOLoop.instance().start() ```

Original source