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中不同进制的语法及转换方法分析
Jul 27 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
详解K-means算法在Python中的实现
Dec 05 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
Python类的继承用法示例
Jan 31 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
Python 如何展开嵌套的序列
Aug 01 Python
python异常中else的实例用法
Jun 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数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
vue系列之动态路由详解【原创】
2017/09/10 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
常见的python正则用法实例讲解
2016/06/21 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
什么造成了Java里面的异常
2016/04/24 面试题
介绍一下grep命令的使用
2015/06/12 面试题
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
竞聘上岗演讲
2014/05/19 职场文书
普通党员对照检查材料
2014/08/28 职场文书
刑事申诉状范文
2015/05/20 职场文书
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis