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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
python批量获取html内body内容的实例
Jan 02 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
django Admin文档生成器使用详解
Jul 22 Python
python正则表达式匹配IP代码实例
Dec 28 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 Python
python实现计算图形面积
Feb 22 Python
python如何利用cv2模块读取显示保存图片
Jun 04 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
php实现简易计算器
2020/08/28 PHP
js调用flash的效果代码
2008/04/26 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
javascript实现拖放效果
2015/12/16 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
vue中activated的用法
2021/01/03 Vue.js
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
浅谈Python单向链表的实现
2015/12/24 Python
python3.x上post发送json数据
2018/03/04 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
淘宝网店营销策划书
2014/01/11 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
领导调研接待方案
2014/02/27 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python