python用装饰器自动注册Tornado路由详解
作者:安生 发布时间:2021-07-16 07:53:37
标签:python,tornado,装饰器
第一个版本
在这个版本中,首先创建了 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, 安生'
来源:https://blog.ansheng.me/article/automatically-register-tornado-routes-with-decorators/
0
投稿
猜你喜欢
- 前言在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个Screens,由于只能一个一个的添加,非常耗时耗经历。下面
- 今天在开发的时候,项目报了一个警告 Duplicate named routes definition ,这里记录一下
- SQL(结构化查询语言)就是负责与ANSI维护的数据库交互的标准。最新的版本是SQL-99,还有一个新标准SQL-200n尚处于制定过程中。
- 网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。(1) 选择
- 1.SGD随机梯度下降随机梯度下降和其他的梯度下降主要区别,在于SGD每次只使用一个数据样本,去计算损失函数,求梯度,更新参数。这种方法的计
- os模块下有两个函数:os.walk()os.listdir()# -*- coding: utf-8 -*- &
- 1 Pytorch以ONNX方式保存模型 def saveONNX(model, filepath): ''
- 一个middleware的例子import timefrom django.urls import reversefrom django.u
- 关于Markdown在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处
- join 方法用于连接字符串数组 s = ['a', 'b', 'c', 'd
- 我一直都不喜欢在访问数据库时采用拼接SQL的方法,原因有以下几点: 1. 不安全:有被SQL注入的风险。 2. 可能会影响性能:每条SQL语
- 在执行程序前,先在MySQL中创建一个数据库"pachong"。import pymysqlimport request
- 本文实例讲述了php购物车实现方法。分享给大家供大家参考。具体分析如下:这里我们为你提供个简单的php购物车代码,从增加购物产品与发生购买了
- 可试试下面这个方法,但要保证在FORM中使用的Input Name都和数据库中使用的是一样的:upfiles.asp<% &
- 如下所示:将不想索引的文件夹设置为Excluded Folders 及设置检索不包括的文件File - Settings - -> P
- 导语:举例:Python做一个根据后缀名整理文件的工具,先来看看效果:自动整理前:自动整理后:这样看起来就好很多了。1.准备开始之前,你要确
- 本文介绍了python opencv 直方图反向投影的方法,分享给大家,具体如下:目标: 直方图反向投影原理: 反向投影可以用来做图像分割,
- 前情提要上文我们分析了挂载组件主要调用了三个函数: createComponentInstance(创建组件实例)、setupCompone
- 有个帖子写的检查全角的 <script> fun
- 这篇文章主要介绍了Python列表切片常用操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋