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读写文件操作示例程序
Dec 02 Python
python实现简单的TCP代理服务器
Oct 08 Python
浅谈Python中的数据类型
May 05 Python
Python 爬虫爬取指定博客的所有文章
Feb 17 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
Python 硬币兑换问题
Jul 29 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
python__new__内置静态方法使用解析
Jan 07 Python
python deque模块简单使用代码实例
Mar 12 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
Python编写冷笑话生成器
Apr 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的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
java script编程起步(第三课)
2007/01/10 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
NW.js 简介与使用方法
2018/02/01 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
理解python正则表达式
2016/01/15 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
python队列queue模块详解
2018/04/27 Python
使用TensorFlow实现SVM
2018/09/06 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
Django用户认证系统 User对象解析
2019/08/02 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
如何提高SQL Server的安全性
2016/07/25 面试题
小学运动会表扬稿
2014/01/19 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python