tornado使用操作指南—模型

前言

在Web开发中,路由的配置定义可以类似Django中urls.py文件这样定义,也可以类似Flask中通过装饰器的形式来定义。当然不同的配置方式都有各自的优势。在Tornado中默认的路由方式的定义如同Django中urls.py文件中的定义格式。如下将修改Tornado的路由定义格式,将采用装饰器的格式来定义路由。

1. 思路

Tornado默认路由文件配置:

  1. app = tornado.web.Application(handlers=[
  2. (r'/index/', IndexHandler),
  3. ])

Tornado修改默认的路由配置文件:

  1. @route(r'/index/')
  2. def IndexHandler(tornado.web.RequestHandler):
  3. def get(self):
  4. pass

2. 修改路由定义

创建 Route 对象,然后再在 Handler 上加上装饰器 @route(r’/‘) ,并把 URL 传递进来,其中对应到 call 方法中的 url 参数,然后把路由对应关系以元祖的方式添加到列表中,待所有的路由都添加完成之后,创建Tornado的路有对象,然后把路由表放进去,最后完成注册。

实现代码如下:

  1. import tornado.ioloop
  2. import tornado.web
  3. class Route(object):
  4. """ 把每个URL与Handler的关系保存到一个元组中,然后追加到列表内,列表内包含了所有的Handler """
  5. def __init__(self):
  6. # 路由列表
  7. self.urls = list()
  8. def __call__(self, url, *args, **kwargs):
  9. def register(cls):
  10. # 把路由的对应关系表添加到路由列表中
  11. self.urls.append((url, cls))
  12. return cls
  13. return register
  14. route = Route() # 创建路由表对象
  15. @route(r'/')
  16. class Main1Handler(tornado.web.RequestHandler):
  17. def get(self, *args, **kwargs):
  18. self.write('Hello main1')
  19. @route(r'/hi')
  20. class Main2Handler(tornado.web.RequestHandler):
  21. def get(self, *args, **kwargs):
  22. self.write('hello main2')
  23. def make_app():
  24. # 创建app,并且把路有关系放入到Application对象中
  25. return tornado.web.Application(route.urls)
  26. if __name__ == '__main__':
  27. app = make_app()
  28. app.listen(8000)
  29. tornado.ioloop.IOLoop.instance().start()