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获取Ping结果示例代码
Jul 06 Python
Python内置模块logging用法实例分析
Feb 12 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
python自定义时钟类、定时任务类
Feb 22 Python
Python实现Singleton模式的方式详解
Aug 08 Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 Python
python代码能做成软件吗
Jul 24 Python
Python如何定义接口和抽象类
Jul 28 Python
python 录制系统声音的示例
Dec 21 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 mssql 时间格式问题
2009/01/13 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
PHP中->和=>的含义及使用示例解析
2020/08/06 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
ie focus bug 解决方法
2009/09/03 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
js常用排序实现代码
2010/12/28 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
python中使用np.delete()的实例方法
2021/02/01 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
新浪网技术部笔试题
2016/08/26 面试题
机电一体化毕业生求职信
2013/11/02 职场文书
物理力学求职信
2014/02/18 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
小学英语课教学反思
2016/02/15 职场文书
Python列表的索引与切片
2022/04/07 Python