Tornado - 如何获取AsynHTTPClient.fetch()的响应?
#!/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()
方法的响应呢?
1 个回答
9
你正在使用 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的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()