gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:22:09 25 4
gpt4 key购买 nike

如何在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com