我也实现了一个 Flask decorator 风格的 Tornado 路由,实现的方式极大地参考了 Flask 的过程(add_url_rule 和 Blueprint)。
Tornado 在新建 Application 的时候, 需要传入一个 handlers 参数, 原本这个 handlers 需要自己手动构建: 收集各个 RequestHandler,给他们分配路径,组成一个 handlers tuple。 这样维护起来非常麻烦。
我实现的功能是:
- 通过 decorator 给每个 RequestHander 即时分配 url pattern;
- 支持根据 API 版本和 Resource 类型自动给 url pattern 添加前缀;
- 可以通过 RequestHander 的类名反向查出 url。
功能一点都不复杂, 实现起来也简单, 不到 100 行代码。下面是我的实现过程。