2011-06-29 55 views
1

决定我今晚会踢Tornado 2.0的轮胎,但它似乎在ASyncHTTPClient上为我做了一个数字。在发行说明中没有2.0表示任何真正的改变是必要的,我如何使用ASyncHTTPClient:从1.2升级到2.0后,Tornado的AsyncHTTPClient不再起作用

[编辑:使代码更明确,自包含例子]

import time 
import threading 
import functools 

import tornado.ioloop 
import tornado.web 
from tornado.httpclient import * 

class MainHandler(tornado.web.RequestHandler): 

    def perform_task(self,finish_function): 
     http_client = AsyncHTTPClient() 
     tornado.ioloop.IOLoop.instance().add_callback(finish_function) 
     # do something 
     for i in range(0,10): 
     print i 
     time.sleep(1) 
     request = tornado.httpclient.HTTPRequest("http://10.0.1.5:8888",method="POST",body="finished countdown") 
     resp = http_client.fetch(request, self.handle_request) 
     return 

    def join_callback(self): 
     # finish the request, also returns control back to ioloop's thread. 
     self.finish() 

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

    @tornado.web.asynchronous 
    def get(self): 
     self.write("Kicking off.") 
     a_partial = functools.partial(self.perform_task,self.join_callback) 
     self.thread = threading.Thread(target=a_partial) 
     self.thread.start() 
     self.write("\n<br/>Done in here, out of my hands now.") 

    # just so this example has something to post to 
    @tornado.web.asynchronous 
    def post(self): 
     self.write("POSTED: %s" % (self.request.body)) 

application = tornado.web.Application([ 
    (r"/", MainHandler), 
]) 

if __name__ == "__main__": 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 

使用默认(非卷曲)ASyncHTTPClient时,我得到如下:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.6/dist-packages/tornado/simple_httpclient.py", line 259, in cleanup 
    yield 
    File "/usr/local/lib/python2.6/dist-packages/tornado/simple_httpclient.py", line 186, in __init__ 
    functools.partial(self._on_connect, parsed)) 
    File "/usr/local/lib/python2.6/dist-packages/tornado/iostream.py", line 120, in connect 
    self.socket.connect(address) 
AttributeError: 'NoneType' object has no attribute 'connect' 

如果我在补充: tornado.httpclient.AsyncHTTPClient.configure(“tornado.curl_httpclient.CurlAsyncHTTPClien T“)

指定我想用PyCurl,我得到以下异常:

Traceback (most recent call last): 
     File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner 
     self.run() 
     File "/usr/lib/python2.6/threading.py", line 484, in run 
     self.__target(*self.__args, **self.__kwargs) 
     File "migratotron.py", line 46, in perform_migration 
     hc.fetch(request,success) 
     File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 81, in fetch 
     self._process_queue() 
     File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 210, in _process_queue 
     curl.info["headers"]) 
     File "/usr/local/lib/python2.6/dist-packages/tornado/curl_httpclient.py", line 276, in _curl_setup_request 
     curl.setopt(pycurl.URL, request.url 

) 
TypeError: invalid arguments to setopt 

不寻常的,我做的是呼吁这是另一个线程我创建做一些后台处理的唯一的事情,它使用add_callback将控制返回给ioloop线程。有没有人看到2.0或类似的东西?

+0

注意:我的代码中的“回调”是一个URL,而不是一个函数。 –

回答

2

这些错误信息有点神秘,但在这两种情况下,我认为他们是由于您的请求没有URL(除非是URL)。

2.0将ASyncHTTPClient实现切换到了simple_httpclient(来自curl_httpclient),但我不认为给出的例子在Tornado 1.2中也能工作。

+0

它是一个URL,我的意思是改变代码,使其更明显的发布,但忘记了。感谢捕捉。 –

+0

没错,但我很确定你得到的错误意味着它没有被正确解析。它有一个领先的'http://'吗? –

相关问题