gpt4 book ai didi

python - Tornado asynchttpclient 结果为 None

转载 作者:行者123 更新时间:2023-11-30 23:26:34 24 4
gpt4 key购买 nike

我已经被这个问题困扰了好几个小时了。我正在尝试使用 AsyncHTTPClient 来获取 Google 等网站的主页。在同一个类中定义了一个函数来执行此操作,代码如下:

client = tornado.httpclient.AsyncHTTPClient()

@asynchronous
def getUrlRes(self,url,params,req_type):
req1 = tornado.httpclient.HTTPRequest(url="http://www.google.com", method="GET")
self.client.fetch(req1,self.urlCallBack)
self.finish()

def urlCallBack(self, response):
print response

我做错了什么?

另一种可遵循的方法,这同样对我不起作用,但对所有人都有效:

@asynchronous
@gen.engine
def getUrlRes(self,url,params,req_type):
req1 = tornado.httpclient.HTTPRequest(url="http://www.google.com", method="GET")
response = yield gen.Task(self.client.fetch,req1)
self.finish()

最佳答案

如果您想调用 gen.engine 函数并从中获取返回值,有一些规则:

  1. 调用者和被调用者都必须用gen.engine修饰。请注意,getUrlRes 不需要用 asynchronous 修饰,但是:只有 getpost 方法需要那个装饰器。

  2. 被调用者需要接受回调参数。

  3. 实际调用是通过 yield gen.Task 完成的。

  4. 被调用者通过将值传递给回调来返回一个值。

将所有内容放在一起,这是一个获取 google.com 并显示内容的 RequestHandler:

class Main(tornado.web.RequestHandler):
client = tornado.httpclient.AsyncHTTPClient()

@tornado.web.asynchronous
@gen.engine
def get(self):
response = yield gen.Task(self.getUrlRes,
"http://www.google.com", [], "GET")

print 'got response of length', len(response.body)
self.finish(response.body)

@gen.engine
def getUrlRes(self, url, params, req_type, callback):
req1 = tornado.httpclient.HTTPRequest(url, method=req_type)
response = yield gen.Task(self.client.fetch, req1)
callback(response)

您可以在我的文章 Refactoring Tornado Code With gen.engine 中阅读有关 gen.engine 和子例程的更多信息。 .

顺便说一句,Tornado 3 通过新的 gen.coroutine 装饰器使这一切变得更加容易:

class Main(tornado.web.RequestHandler):
client = tornado.httpclient.AsyncHTTPClient()

@gen.coroutine
def get(self):
response = yield self.getUrlRes("http://www.google.com", [], "GET")
print 'got response of length', len(response.body)
self.finish(response.body)

@gen.coroutine
def getUrlRes(self, url, params, req_type):
req1 = tornado.httpclient.HTTPRequest(url, method=req_type)
response = yield self.client.fetch(req1)
raise gen.Return(response)

@asynchronousgen.Task 和显式回调都消失了。函数调用看起来几乎正常。协程和常规函数之间的主要区别在于 yield 语句,以及使用 raise gen.Return 从子例程返回值。

关于python - Tornado asynchttpclient 结果为 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22435636/

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