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. .NET和C#的版本历史

    维基百科页面:https://en.wikipedia.org/wiki/.NET_Framework_version_history Versionnumber CLRversion Release ...

  2. 0xC015000F:正被停用的激活上下文不是最近激活的

    项目程序运行的时候,突然出现这个错误,调用堆栈中的函数,没有一个是自己写的,非常困惑. 在网上搜索了一下,先找到一个提示,可以在CApp::InitInstance()中禁用ActivationCon ...

  3. 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」

    题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...

  4. spring boot项目分享

    Spring boot项目分享 以下项目是我自己做的一些练习项目,有兴趣的小伙伴可以下载下来看下 1.员工管理系统 下载地址:我的github 后续会继续补充

  5. 关于函数传参的其他问题(const形参实参/可变形参)

    const 形参和实参 当形参是 const 变量时,实参是 const 或者不是 const 变量都可以. 实参初始化形参时会忽略掉顶层 const: void gel(const int a){ ...

  6. vue-i18n.esm.js?a925:14 [vue-i18n] Value of key '图标管理' is not a string!

    解决方案:在项目的index.js文件中修改配置,让在创建 i18n 示例的时候加上参数去掉这些 warning const i18n = new VueI18n({ locale: lang, // ...

  7. SpringCloud-Zuul搭建

    一.创建工程,在pom中引入Zuul 二.重写路由加载类,实在路由的动态注册和路由转发 package com.genius.gateway.zuul; import com.genius.gatew ...

  8. shared_ptr智能指针

    来自博客:https://www.cnblogs.com/lzpong/p/6188034.html 多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_p ...

  9. WPF 仿IPhone滑块开关 样式 - CheckBox

    原文:WPF 仿IPhone滑块开关 样式 - CheckBox <Style x:Key="CheckRadioFocusVisual"> <Setter Pr ...

  10. P4890 Never·island

    传送门 考虑把总区间长度减去最多能减少的区间长度 把所有区间离散化,对每一小段计算贡献 分类讨论一波,对于边界 $i,i+1$ ,设它们之间距离 $d$,$i$ 属于 $x$ 考察队的边界,$i+1$ ...