asynchronous - 如何在 Tornado 中将异步函数和生成函数包装在一起?

标签 asynchronous generator tornado

如何在 Tornado 中将异步函数和生成函数包装在一起? 我的代码如下所示,错误是“Future”对象没有属性“body”。

我是否以错误的方式放置了装饰器?

import tornado.httpclient
import tornado.web
import tornado.gen
import tornado.httpserver
import tornado.ioloop

class Class1(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def post(self, *args, **kwargs):
        url = self.get_argument('url', None)
        response = self.json_fetch('POST', url, self.request.body)
        self.write(response.body)
        self.finish()

    @tornado.gen.engine
    def json_fetch(self, method, url, body=None, *args, **kwargs):
        client = tornado.httpclient.AsyncHTTPClient()
        headers = tornado.httputil.HTTPHeaders({"content-type": "application/json charset=utf-8"})
        request = tornado.httpclient.HTTPRequest(url, method, headers, body)
        yield tornado.gen.Task(client.fetch, request)

最佳答案

在此代码示例中您不需要“异步”。 “gen.engine”已过时,请改用“coroutine”。这些天你通常也不需要经常使用“gen.Task”。对您的代码进行四处更改:

  1. 将“post”包裹在“coroutine”中
  2. “产生”self.json_fetch 的结果,而不是直接使用结果。
  3. 无需在协程中调用“finish”,Tornado 在协程完成时完成响应。
  4. 也将 json_fetch 包装在“coroutine”中。

结果:

class ClubCreateActivity(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def post(self, *args, **kwargs):
        url = self.get_argument('url', None)
        response = yield self.json_fetch('POST', url, self.request.body)
        self.write(response.body)

    @tornado.gen.coroutine
    def json_fetch(self, method, url, body=None, *args, **kwargs):
        client = tornado.httpclient.AsyncHTTPClient()
        headers = tornado.httputil.HTTPHeaders({"content-type": "application/json charset=utf-8"})
        request = tornado.httpclient.HTTPRequest(url, method, headers, body)
        response = yield client.fetch(request)
        raise gen.Return(response)

进一步阅读:

关于asynchronous - 如何在 Tornado 中将异步函数和生成函数包装在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27481695/

相关文章:

python 我应该在这种情况下使用生成器吗?

python - 与迭代器相比,生成器返回隐式可迭代序列意味着什么?

python - IOLoop.current().run_in_executor() 和 ThreadPoolExecutor().submit() 的区别

php - 带引用的发电机不工作

javascript - 如何从 Tornado 中的嵌套字典和数组中获取参数

python - 在 Tornado 中运行阻塞代码

javascript - Angularjs 中的并发

java - 在 try-catch-finally block 中调用异步方法

javascript - 可观察对象存储在浏览器内存中的什么位置?

node.js - 在一种情况下使用 if/else 与异步代码