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编程之属性和方法实例详解
May 19 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
python快速建立超简单的web服务器的实现方法
Feb 17 Python
python生成带有表格的图片实例
Feb 03 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
实例详解Python装饰器与闭包
Jul 29 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
python中提高pip install速度
Feb 14 Python
Python包和模块的分发详细介绍
Jun 19 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 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多态的实现详解
2013/06/09 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python中类的一些方法分析
2014/09/25 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
师范生个人推荐信
2013/11/29 职场文书
英文自荐信常用句子
2014/03/26 职场文书
致共产党员倡议书
2014/04/16 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
负责培养人意见
2015/06/05 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
MySQL 数据 data 基本操作
2022/05/04 MySQL
win sever 2022如何占用操作主机角色
2022/06/25 Servers