tornado handler 调用

特性

在一次 tornado 请求中调用其他 tornado handler 中的方法, 比如 run 方法

引言

在后台开发中, 有时需要做一些功能的整合, 比如请求1,2,3 各自完成一项功能, 而现在有需求, 需要一次请求完成这三个功能,如果 handler 中请求逻辑与功能逻辑分离的很清晰(理想状态), 那直接调用功能逻辑就很方便, 但可能由于种种原因, handler 很有可能会有不少涉及到功能逻辑的代码。 只是对用户透明的话,也是可以由客户端来实现(比如发三次请求)。但可能后续还会有其他一些功能的整合, 以及网络延迟的问题, 所以最终确定由后台完成。

备注

flask 中有提供方法构造请求, 但 tornado 中没有提供, 需要自己实现

实现目标

实现一个方法, 传入 需要调用的 handler class, handler inputs, 以及一些其他 hanlder 中被调用函数所必须的参数, 返回 handler 调用的运算后的结果

实现思路

hander 的真实调用涉及相当多的准备工作, 错误处理以及收尾工作。 但 handler 中的方法的本质还是函数, 所以只要我们能提供这个函数运算所需要的数据, 那它就能正常的运算。 因为 python 是运行时语言,所以们并不需要去管那些 handler 中我们不需要调用到的方法所需要的数据而作为一个真正 hander 所必须的数据。 我们可以通过重写来避免这些真实 handler 所必须的数据。

示例

@coroutine
def doFakeHandle(handler, inputs,game, application):
class FakeHandle(handler):
def __init__(self, inputs, application, game):
self.application = application
self._game = game
self.input = inputs
self.write_list={} @property
def game(self):
return self._game def write(self, chunk):
self.write_list.update(chunk) handler = FakeHandle(inputs, application, game)
try: yield handler.run()
except Exception, e:
if not isinstance(e, Return): raise e
raise Return(handler.write_list)

另外的实现思路:描述符和普通函数

python 新式类可以使用描述符,将需要复用的方法绑定到当前实例, 也可当成普通方法直接调用,不过都需要保证当前实例与复用方法中实例行为一致 。

示例

from aim_handler import AimClass

class NewHandler(BaseHandler):

    @coroutine
def run(self):
self.input = input_data
yield AimClass.run.__get__(self, AimClass)()
# 也可以直接当成普通方法调用
# yield AimClass.run(self)
self.real_write() def write(self, chunk):
pass def real_write(self):
pass

注意

handler 方法的调用可能会涉及到 import 问题, 一个解决办法是把 import 语句放到调用 doFakeHandle 的函数中

因为历史原因使用,正常业务开发中都应该避免使用使用

tornado handler 方法复用的 3 个方法的更多相关文章

  1. [Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法

    前面有几条都讲过关于Array.prototype的标准方法.这些标准方法被设计成其他对象可复用的方法,即使这些对象并没有继承Array. arguments对象 在22条中提到的函数argument ...

  2. Android handler 内存泄露分析及解决方法

    1. 什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引 ...

  3. legend3---17、如何抽象和复用控制器中的方法

    legend3---17.如何抽象和复用控制器中的方法 一.总结 一句话总结: 比如不同的控制器中都用了检查手机号是否已经注册,是否没注册这样的功能,我应该如何抽象和复用方法 新建一个处理手机号码的模 ...

  4. tornado和vue的模板冲突解决方法

    tornado和vue的模板冲突解决方法 Vue的插值表达式和tornado的模板都为一对花括号,可以通过修改vue的插值表达式的符号来解决这个问题,具体方法如下: var vm = new Vue( ...

  5. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

  6. 理解 backbone.js 中的 bind 和 bindAll 方法,关于如何在方法中指定其中的 this,包含apply方法的说明[转载]

    转载自:http://gxxsite.com/content/view/id/132.html 在backbone.js的学习过程中,被bind和bindAll弄得有点晕,这里包括underscore ...

  7. 类属性与对象实现,init方法的作用,绑定方法,绑定方法与普通函数的区别,继承,抽象与继承,派生与覆盖

    今日内容: 1.类属性与对象属性 2.init方法的作用 3.绑定方法 4.绑定方法与普通函数的区别(非绑定方法) 5.继承 6.抽象与继承 7.派生与覆盖 1.类属性与对象属性 类中应该进存储所有对 ...

  8. java 遍历map 方法 集合 五种的方法

    package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...

  9. 为什么Java方法里面不能再嵌套方法?

    直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法. 个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体. ...

随机推荐

  1. SqlServer给一个表增加多个字段语法

    添加字段语法 alter table table_name add column_name +字段类型+ 约束条件 给一个表增加多个字段: use NatureData go alter table ...

  2. 「TJOI2015」线性代数

    题目链接 戳我 \(Describe\) 题目描述 为了提高智商,\(ZJY\)开始学习线性代数.她的小伙伴菠萝给她出了这样一个问题:给定一个\(n×n\)的矩阵\(B\)和一个\(1×n\)的矩阵\ ...

  3. ecliplse导入tomcat

    上面点击之后,弹出的窗口最大化: 导入成功之后如下图:

  4. mysql事务隔离级别回顾

    事务隔离级别是针对读数据库数据的一种规则.事务隔离级别是数据库属性不是事务属性. 1.读未提交(read uncommited) 可以读到其他事务修改未提交的数据.(有 脏读,不可重复读,幻读) 事务 ...

  5. 基于Haar特征的Adaboost级联人脸检测分类器

    基于Haar特征的Adaboost级联人脸检测分类器基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征 ...

  6. soapui

    webservice 的请求可使用工具:soapui 天气预报的接口地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsd ...

  7. Java FileInputStream与FileReader的区别

    在解释Java中FileInputStream和FileReader的具体区别之前,我想讲述一下Java中InputStream和Reader的根本差异,以及分别什么时候使用InputStream和R ...

  8. 通过html()的方法获取文本内容, form表单组件显示的值与获取到的值不一致的问题

    我在通过 html()获取对应节点的内容,发现一个问题,获取到的 form表单组件的内容值是初始加载的值,而不是经过用户修改后的值.例如页面加载时组件<input type="text ...

  9. Unity---动画系统学习(6)---Avatar Mask动画融合、Layers动画分层、IK反向动力学

    1. 介绍 Avatar Mask(动画融合) 前面我们一直介绍的都是动画混合,一般用于解决边跑边转弯的问题.而动画融合一般用于解决例如边跑边挥手的问题. 简单说就是让跑步去控制腿的骨骼,挥手控制手的 ...

  10. c语言数据结构学习心得——线性表

    线性表:具有相同数据类型的n(n>0)个数据元素的有限序列. 主要有顺序存储和链式存储. 顺序存储: 特点:地址连续,随机/存取,顺序存储. 建立:首地址/存储空间大小(数组),表长. 方式:静 ...