---
layout: post
title: 另一种思路实现 Tornado 装饰器路由
---

`Tornado` 不同于 `Flask` 其中之一就是路由的配置，有感于 Tornado 路由配置方式的不方便，决定实现与 `Flask` 一样的装饰器路由，其实网上已经有人实现了，详细 [猛戳此处](http://www.cnblogs.com/tonyseek/archive/2011/05/27/2062227.html)。

大概看了下，略显复杂啊，于是自己想了想有以下代码：


```python
#!/usr/bin/env python
#coding: utf-8

import tornado.ioloop
import tornado.web


class Route(object):
    def __init__(self):
        self.url_list = list()

    def __call__(self, url):
        def _(cls):
            self.url_list.append((url, cls))

            return cls

        return _

route = Route()


@route('/')
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('hello world')


application = tornado.web.Application(route.url_list)


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


思路很简单，就是把需要手动配置的 `路由信息` 用装饰器自动加载到 url_list 中去。

只是个人想法，不知道是否有不妥的地方。

---
layout: post
title: 另一种思路实现 Tornado 装饰器路由
---

`Tornado` 不同于 `Flask` 其中之一就是路由的配置，有感于 Tornado 路由配置方式的不方便，决定实现与 `Flask` 一样的装饰器路由，其实网上已经有人实现了，详细 [猛戳此处](http://www.cnblogs.com/tonyseek/archive/2011/05/27/2062227.html)。

大概看了下，略显复杂啊，于是自己想了想有以下代码：


```python

#!/usr/bin/env python
#coding: utf-8

import tornado.ioloop
import tornado.web


class Route(object):
    def __init__(self):
        self.url_list = list()

    def __call__(self, url):
        def _(cls):
            self.url_list.append((url, cls))

            return cls

        return _

route = Route()


@route('/')
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('hello world')


application = tornado.web.Application(route.url_list)


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


思路很简单，就是把需要手动配置的 `路由信息` 用装饰器自动加载到 url_list 中去。

只是个人想法，不知道是否有不妥的地方。

Update by gitblog.io at 2016/2/24 下午3:47:20
Update by gitblog.io at 2016/2/24 下午3:47:20