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检测远程udp端口是否打开的方法
Mar 14 Python
Python3处理文件中每个词的方法
May 22 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
如何高效使用Python字典的方法详解
Aug 31 Python
python如何实现反向迭代
Mar 20 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
基于python的列表list和集合set操作
Nov 24 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
Python configparser模块应用过程解析
Aug 14 Python
Python道路车道线检测的实现
Jun 27 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
一个程序下载的管理程序(三)
2006/10/09 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
Javascript 类型转换方法
2010/10/24 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
python3简单实现微信爬虫
2015/04/09 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python自动识别文本编码格式代码
2019/12/26 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
2013年保送生自荐信格式
2013/11/20 职场文书
开办饭店创业计划书
2013/12/28 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
置业顾问岗位职责
2014/03/02 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers