tornado 用上装饰器路由,tornado路由,base.py 这个是改
tornado 用上装饰器路由,tornado路由,base.py 这个是改
base.py 这个是改造的全文
#!/usr/bin/env python# coding:utf-8"""基础模块, 扩展了 Tornado Web 服务器@author: tonyseek"""import tornado.webclass Application(tornado.web.Application): """ Tornado 应用实例 """ def load_handler_module(self, handler_module, perfix = ".*$"): """ 从模块加载 RequestHandler `handler_module` : 模块 `perfix` : url 前缀 """ # 判断是否是有效的 RequestHandler (是类且是 RequestHandler 的子类) is_handler = lambda cls: isinstance(cls, type) \ and issubclass(cls, RequestHandler) # 判断是否拥有 url 规则 has_pattern = lambda cls: hasattr(cls, 'url_pattern') \ and cls.url_pattern handlers = [] # 迭代模块成员 for i in dir(handler_module): cls = getattr(handler_module, i) if is_handler(cls) and has_pattern(cls): handlers.append((cls.url_pattern, cls)) self.add_handlers(perfix, handlers) def _get_host_handlers(self, request): """ 覆盖父类方法, 一次获取所有可匹配的结果. 父类中该方法一次匹配成功就返回, 忽略后续 匹配结果. 现通过使用生成器, 如果一次匹配的结果不能使用可以继续匹配. """ host = request.host.lower().split(':')[0] # 使用生成器表达式而非列表推导式, 减少性能折扣 handlers = (i for p, h in self.handlers for i in h if p.match(host)) # Look for default host if not behind load balancer (for debugging) if not handlers and "X-Real-Ip" not in request.headers: handlers = [i for p, h in self.handlers for i in h if p.match(self.default_host)] return handlersclass RequestHandler(tornado.web.RequestHandler): url_pattern = Nonedef route(url_pattern): """ 路由装饰器, 只能装饰 RequestHandler 子类 """ def handler_wapper(cls): assert(issubclass(cls, RequestHandler)) cls.url_pattern = url_pattern return cls return handler_wapper
main.py 使用装饰器路由
#!/usr/bin/env python# coding:utf-8import base@base.route('/')class Main(base.RequestHandler): def get(self): self.write("Hello World")@base.route('/(.*)')class Person(base.RequestHandler): def get(self, name): self.write(name)
run.py 装载改造过的模块,启动应用。无缝装载哦,去掉那句就卸载了哦~
#!/usr/bin/env python# coding:utf-8import tornado.ioloopimport baseimport mainapplication = base.Application()# 装载 Request Handler 模块application.load_handler_module(main)if __name__ == "__main__": application.listen(8080) tornado.ioloop.IOLoop.instance().start()
相关内容
- python多进程分块读取文件,,[Python]代码#
- 子网掩码格式转换,,子网掩码转换# codi
- 多线程测试 系统hosts文件主机网络情况,多线程hosts,
- ergodic_db_tb.py,,[Python]代码#!
- 单链表和二叉树的操作,单链表二叉树操作,#author:
- 批量下载51voa的文本和MP3,51voa文本mp3,[Python]代码My
- 加速器后台程序,,[Python]代码#!
- 快速多线程ping,多线程ping,[Python]代码#!
- 在VIM中使用GOOGLE进行搜索或者翻译,vimgoogle,[Python]代码
- secure crt 脚本,securecrt,[Python]代码#$
评论关闭