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根据文件大小打log日志
Oct 09 Python
Python+Wordpress制作小说站
Apr 14 Python
Numpy之文件存取的示例代码
Aug 03 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
python+os根据文件名自动生成文本
Mar 21 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
基于python 凸包问题的解决
Apr 16 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 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获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
TensorFlow损失函数专题详解
2018/04/26 Python
python把1变成01的步骤总结
2019/02/27 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
个人思想理论学习的自我鉴定
2013/11/30 职场文书
心理健康心得体会
2014/01/02 职场文书
大学生找工作求职信
2014/07/09 职场文书
项目申请汇报材料
2014/08/16 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2015年见习期工作总结
2014/12/12 职场文书
公务员年度个人总结
2015/02/12 职场文书
清洁工个人工作总结
2015/03/05 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python