gpt4 book ai didi

python - Tornado - 如何获得 AsynHTTPClient.fetch() 的响应?

转载 作者:可可西里 更新时间:2023-11-01 16:24:29 26 4
gpt4 key购买 nike

#!/usr/bin/env python

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient

import urllib
import json
import datetime
import time

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

config = {
'proxy_host': '58.59.21.228',
'proxy_port': 25,
'proxy_username': 'yz',
'proxy_password': 'fangbinxingqusi',
}

def handle_request(response):
if response.error:
print "Error:", response.error

tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")

class IndexHandler(tornado.web.RequestHandler):
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
response = client.fetch("http://twitter.com/", handle_request,
**config)
self.write(response.body)

if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)],
debug=True)
httpserver = tornado.httpserver.HTTPServer(app)
httpserver.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

在运行时,get() 方法中的response 对象被报告为None 类型。如何在get()方法中得到fetch()方法的响应?

最佳答案

您正在使用 AsyncHTTPClient ,因此 fetch 方法不会返回任何内容。您需要使用“异步”装饰器并记住在 fetch 调用的回调中调用 finish

代码如下:

import tornado.httpserver                                                    
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

config = {
'proxy_host': '58.59.21.228',
'proxy_port': 25,
'proxy_username': 'yz',
'proxy_password': 'fangbinxingqusi',
}

tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")


class IndexHandler(tornado.web.RequestHandler):

@tornado.web.asynchronous
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
client.fetch("http://twitter.com/", self.handle_request, **config)

def handle_request(self, response):
if response.error:
print("Error:", response.error)
else:
self.write(response.body)
self.finish()


if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)], debug=True)
httpserver = tornado.httpserver.HTTPServer(app)
httpserver.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

您还可以使用 Tornado's gen让你的处理程序更漂亮:

class IndexHandler(tornado.web.RequestHandler):                              

@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
response = yield tornado.gen.Task(client.fetch, "http://twitter.com/",
**config)
if response.error:
self.write("Error: %s" % response.error)
else:
self.write(response.body)

self.finish()

关于python - Tornado - 如何获得 AsynHTTPClient.fetch() 的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829047/

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