Tornado is intriguing, but the main thing I don't like about it is how it reinvents the wheel with a lot of its components. For example:
- They created a lot of Web-stuff parsing code themselves, when Werkzeug provides a tested and thorough implementation of a lot of that. (Especially routing, regex-based routing just looks horribly kludgy once you have used werkzeug.routing.)
- They created their own template language when they could have used Jinja. (In fact, tornado.template is basically a half-as-powerful copy of Jinja.)
- They created their own database access layer when they could have used SQLAlchemy instead.
Sometimes I think people take the concept of "minimal dependencies" way too far.
tornado.database has no real ties to the rest of the system; you can (and I usually do) use SQLAlchemy or another database layer instead. You can also call another template engine if you prefer, but you're sort of stuck with the url routing.
If you bring in tons of third party code you end up with a mess like Pylons. For people new to a framework, it's a pain to learn that when a problem arises you need to go look up the docs for a separate framework.
Or you end up with something really solid and enjoyable to work with, like Flask. Which is just a combination of Werkzeug and Jinja with some glue and excellent documentation.
- They created a lot of Web-stuff parsing code themselves, when Werkzeug provides a tested and thorough implementation of a lot of that. (Especially routing, regex-based routing just looks horribly kludgy once you have used werkzeug.routing.)
- They created their own template language when they could have used Jinja. (In fact, tornado.template is basically a half-as-powerful copy of Jinja.)
- They created their own database access layer when they could have used SQLAlchemy instead.
Sometimes I think people take the concept of "minimal dependencies" way too far.