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实现115网盘自动下载的方法
Sep 30 Python
简单谈谈python中的多进程
Nov 06 Python
Python中str.format()详解
Mar 12 Python
python如何在循环引用中管理内存
Mar 20 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
python 模拟在天空中放风筝的示例代码
Apr 21 Python
理解python中装饰器的作用
Jul 21 Python
分享3个非常实用的 Python 模块
Mar 03 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 Try Catch异常测试
2009/03/01 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
php连接数据库代码应用分析
2011/05/29 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
微信小程序动态添加分享数据
2017/06/14 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
python脚本实现查找webshell的方法
2014/07/31 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Django中的ajax请求
2018/10/19 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
行风评议整改报告
2014/11/06 职场文书
丽江古城导游词
2015/02/03 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
给朋友的赠语
2015/06/23 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang