tornado handler 伪调用
程序员文章站
2022-10-18 16:37:41
tornado handler 调用 特性 在一次 tornado 请求中调用其他 tornado handler 中的方法, 比如 run 方法 引言 在后台开发中, 有时需要做一些功能的整合, 比如请求1,2,3 各自完成一项功能, 而现在有需求, 需要一次请求完成这三个功能,如果 handle ......
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)
注意
- handler 中方法的调用需要根据具体项目具体考虑, 上面的示例不针对一般情况,可以考虑用 **kwargs 来实现对具体项目更通用的方法
- handler 方法的调用可能会涉及到 import 问题, 一个解决办法是把 import 语句放到调用 dofakehandle 的函数中
推荐阅读
-
tornado handler 伪调用
-
ajax调用handler,使用HttpWebRequest访问WCF服务
-
未整理的数组、伪数组、匿名函数及其自调用
-
session_set_save_handler的调用过程是如何样的
-
discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法 - 申文哲
-
tornado handler 伪调用
-
discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法 - 申文哲
-
discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法,discuzx3
-
discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法,discuzx3_PHP教程
-
Tornado—接口调用时方式执行顺序