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实现从订阅源下载图片的方法
Mar 11 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
python中reload(module)的用法示例详解
Sep 15 Python
python回调函数中使用多线程的方法
Dec 25 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
浅谈Python type的使用
Nov 19 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
2020版Python学习路线图(附学习资料)
Sep 15 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写的AES加密解密类分享
2014/06/20 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
实现无刷新联动例子汇总
2015/05/20 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
Python实现识别手写数字大纲
2018/01/29 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
对python函数签名的方法详解
2019/01/22 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
Python try except else使用详解
2021/01/12 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
生活部的活动方案
2014/08/19 职场文书
违纪学生保证书
2015/02/27 职场文书
质量承诺书格式范文
2015/04/28 职场文书
学校运动会感想
2015/08/10 职场文书
学校团代会开幕词
2016/03/04 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
vue中data里面的数据相互使用方式
2022/06/05 Vue.js