tornado curl_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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`add_socket` 和 `listen` 都是 Tornado 框架中用来启动服务的方法,但是它们的作用略有不同。 `listen` 是 Tornado 服务器启动的主要方法,它会创建一个 `HTTPServer` 对象,并绑定一个端口(可以是一个整数或者一个 `socket` 对象),然后开始监听客户端请求。例如: ```python import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": app = tornado.web.Application([(r"/", MainHandler)]) app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 上面的代码中,我们通过 `app.listen(8888)` 启动了 Tornado 服务器,并绑定了 8888 端口。 `add_socket` 则是在 Tornado 服务器已经启动之后,动态地添加一个新的监听端口。例如: ```python import tornado.ioloop import tornado.web import socket class SecondHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world from second listener") if __name__ == "__main__": app = tornado.web.Application([(r"/", MainHandler), (r"/second", SecondHandler)]) app.listen(8888) # 添加一个新的监听端口 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) sock.bind(('localhost', 8889)) sock.listen(128) app.add_socket(sock) tornado.ioloop.IOLoop.current().start() ``` 上面的代码中,我们启动了一个 Tornado 服务器,并绑定了 8888 端口。然后,我们通过创建一个新的 `socket` 对象,并将其绑定到 8889 端口,再通过 `app.add_socket(sock)` 方法将其添加到 Tornado 服务器中。这样,我们就成功地为 Tornado 服务器添加了一个新的监听端口。 因此,`listen` 和 `add_socket` 的主要区别在于,`listen` 是用来启动 Tornado 服务器的,而 `add_socket` 则是用来在运行过程中动态地添加一个新的监听端口的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值