python用装饰器自动注册Tornado路由详解


Posted in Python onFebruary 14, 2017

第一个版本

在这个版本中,首先创建了 RouterConfig 对象,其构造方法创建了 tornado.web.Application() 并赋值为 self.Application ,在每个 Handler 上添加 @app.route 装饰器,对应的就是 RouterConfig 下面的 route 对象,其中 Handler 实例会被赋值到 handler 参数中,最后把 URL 和 Handler 对应关系添加到路由表中, URL 在每个 Handler 中创建的属性。

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

# Created by 安生 on 2017/2/9

import tornado
import tornado.web
import tornado.ioloop

class RouterConfig:
 def __init__(self):
  self.Application = tornado.web.Application() # 创建路由对象

 def route(self, handler):
  self.Application.add_handlers('.*$', [(handler.URL, handler)]) # 路有关系映射添加到路由表中

app = RouterConfig() # 创建路由

@app.route
class MainHandler(tornado.web.RequestHandler):
 URL = r'/'

 def get(self, *args, **kwargs):
  self.write('Hello, 安生')

@app.route
class MainHandler(tornado.web.RequestHandler):
 URL = r'/hi'

 def get(self, *args, **kwargs):
  self.write('hi, 安生')

if __name__ == "__main__":
 app.Application.listen(8000)
 print("http://127.0.0.1:8000/")
 tornado.ioloop.IOLoop.instance().start()

第二个版本

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

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

# Created by 安生 on 2017/2/9

import tornado.ioloop
import tornado.web

class Route(object):
 """ 把每个URL与Handler的关系保存到一个元组中,然后追加到列表内,列表内包含了所有的Handler """

 def __init__(self):
  self.urls = list() # 路由列表

 def __call__(self, url, *args, **kwargs):
  def register(cls):
   self.urls.append((url, cls)) # 把路由的对应关系表添加到路由列表中
   return cls

  return register

route = Route() # 创建路由表对象

@route(r'/')
class MainHandler(tornado.web.RequestHandler):
 def get(self, *args, **kwargs):
  self.write('Hello, 安生')

@route(r'/hi')
class MainHandler(tornado.web.RequestHandler):
 def get(self, *args, **kwargs):
  self.write('hi, 安生')

application = tornado.web.Application(route.urls) # 创建app,并且把路有关系放入到Application对象中

if __name__ == '__main__':
 application.listen(8000)
 print("http://127.0.0.1:%s/" % 8000)
 tornado.ioloop.IOLoop.instance().start()

第三个版本

这个版本也是我现在在使用版本,原理都一样,这里的特点就是继承Tornado路由对象

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

# Created by 安生 on 2017/2/9

import tornado.web
import tornado.ioloop

class RouterConfig(tornado.web.Application):
 """ 重置Tornado自带的路有对象 """

 def route(self, url):
  """
  :param url: URL地址
  :return: 注册路由关系对应表的装饰器
  """

  def register(handler):
   """
   :param handler: URL对应的Handler
   :return: Handler
   """
   self.add_handlers(".*$", [(url, handler)]) # URL和Handler对应关系添加到路由表中
   return handler

  return register

app = RouterConfig(cookie_secret='ulb7bEIZmwpV545Z') # 创建Tornado路由对象,默认路由表为空

@app.route(r'/')
class MainHandler(tornado.web.RequestHandler):
 def get(self, *args, **kwargs):
  self.write('Hello, 安生')

@app.route(r'/hi')
class MainHandler(tornado.web.RequestHandler):
 def get(self, *args, **kwargs):
  self.write('hi, 安生')

if __name__ == "__main__":
 app.listen(8000)
 print("http://127.0.0.1:%s/" % 8000)
 tornado.ioloop.IOLoop.instance().start()

测试

以上一个版本中,测试方法及输出都是一样的,可以用 requests 模块模拟HTTP请求

>>> import requests
>>> requests.get('http://127.0.0.1:8000/').text
'Hello, 安生'
>>> requests.get('http://127.0.0.1:8000/hi').text
'hi, 安生'

总结

以上就是关于使用装饰器自动注册Tornado路由的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
通过Python实现一个简单的html页面
May 16 Python
Django正则URL匹配实现流程解析
Nov 13 Python
利用python程序生成word和PDF文档的方法
Feb 14 #Python
Python中类型检查的详细介绍
Feb 13 #Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 #Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 #Python
python数据清洗系列之字符串处理详解
Feb 12 #Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 #Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 #Python
You might like
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
Vue中props的使用详解
2018/06/15 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
pandas 时间格式转换的实现
2019/07/06 Python
Python批量启动多线程代码实例
2020/02/18 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
浅谈Python __init__.py的作用
2020/10/28 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
高中毕业生自我鉴定
2013/11/03 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
美丽人生观后感
2015/06/03 职场文书
python - asyncio异步编程
2021/04/06 Python
php实例化对象的实例方法
2021/11/17 PHP
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android