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() ```