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 10 Python
python3中int(整型)的使用教程
Mar 23 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
Python面向对象类的继承实例详解
Jun 27 Python
利用nohup来开启python文件的方法
Jan 14 Python
Pycharm+Python+PyQt5使用详解
Sep 25 Python
浅谈Python type的使用
Nov 19 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
Aug 26 Python
python音频处理的示例详解
Dec 23 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
python入门学习关于for else的特殊特性讲解
Nov 20 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木马的防范方法
2009/10/09 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
深入探讨前端框架react
2015/12/09 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
JS中图片压缩的方法小结
2017/11/14 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
python 字符串格式化代码
2013/03/17 Python
对Django中内置的User模型实例详解
2019/08/16 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
大学生职业生涯规划书模版
2013/12/30 职场文书
十八大报告观后感
2014/01/28 职场文书
经典广告词大全
2014/03/14 职场文书
农村党支部承诺书
2015/04/30 职场文书
入党积极分子群众意见
2015/06/01 职场文书
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL