龙卷风 - 如何获得AsyncHTTPClient.fetch()的响应?

时间:2013-02-12 09:14:02

标签: python debugging http web tornado

#!/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()

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

1 个答案:

答案 0 :(得分:9)

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

以下是代码:

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()