天天看點

tornado curl_httpclient proxytornado httpclientcurl_httpclient 使用proxy執行個體

tornado httpclient

預設simple_httpclient,滿足大部分普通需求.

curl_httpclient更多特性(需要libcurl pycurl):

  • 支援http proxy,以及使用指定網絡接口
  • 不死磕http規範,相容更多站點
  • 效率更高

curl_httpclient 使用proxy執行個體

以下代碼執行的機器通過代理通路網絡

>>> import tornado
>>> tornado.version
'4.2.1'
>>> from tornado.httpclient import HTTPClient
>>> from tornado.httpserver import HTTPRequest
>>> c = HTTPClient()
>>> req = HTTPRequest(url="http://t.cp31.ott.cibntv.net/XXXX", follow_redirects=False, proxy_host="10.103.11.11", proxy_port=81)
>>> c.fetch(req)
Traceback (most recent call last):
  File "", line 1, in 
  File "/opt/python2.7/lib/python2.7/site-packages/tornado-4.2.1-py2.7-linux-x86_64.egg/tornado/httpclient.py", line 102, in fetch
    self._async_client.fetch, request, **kwargs))
  File "/opt/python2.7/lib/python2.7/site-packages/tornado-4.2.1-py2.7-linux-x86_64.egg/tornado/ioloop.py", line 445, in run_sync
    return future_cell[0].result()
  File "/opt/python2.7/lib/python2.7/site-packages/tornado-4.2.1-py2.7-linux-x86_64.egg/tornado/concurrent.py", line 215, in result
    raise_exc_info(self._exc_info)
  File "", line 3, in raise_exc_info
tornado.httpclient.HTTPError: HTTP 599: Timeout

#simple_httpclient 不支援代理,599逾時

>>> from tornado.curl_httpclient import CurlAsyncHTTPClient
>>> from tornado.ioloop import IOLoop
>>> c = CurlAsyncHTTPClient()
>>> def print_response(r):
...     print r.error or r.body
... 
>>> c.fetch(req, print_response)
>>> IOLoop.instance().start()
HTTP 301: Moved Permanently
ERROR:tornado.application:Future exception was never retrieved: HTTPError: HTTP 301: Moved Permanently

# curl_httpclient使用代理成功聯網,取得該URL的301資訊
      

是以有童鞋說curl可以通路某個URL,證明網絡通暢,就是tornado代碼無法通路該URL,大概原因就是如此了.調試步驟

  • curl 能通路,說明網絡通暢(不論是否有走代理)
  • urllib2确認一下Python代碼能通路,如果urllib2都能通路,tornado不行,那極大機率是上面所述
  • tornado換curl_httpclient

繼續閱讀