Python urllib3 urlopen 在特定错误下不重试

3 投票
1 回答
1605 浏览
提问于 2025-04-18 10:02

为什么从 urllib3 里的 urlopen 在遇到 ReadTimeoutError 时不进行重试呢?我是不是漏掉了什么?我可以通过自己写重试代码来解决这个问题,但我更希望能用模块里的重试功能。

我甚至尝试过在 HTTPSConnectionPool.request() 中明确设置 retries=3 作为参数,但这也没有帮助……

这是我的代码:

conn = urllib3.HTTPConnectionPool(host, port=port)
return conn.request(method, api_url, data, retries=3, 
                    timeout=urllib3.Timeout(connect=2, read=3))

谢谢!

补充:

现在,有一些调试信息的响应(这是来自 openERP 的日志):

2014-06-18 08:36:42,791 5585 DEBUG test 
openerp.addons.myaddon.xml_request.xml_request: args prepared
2014-06-18 08:36:42,791 DEBUG Added an stderr logging handler to logger: 
urllib3
2014-06-18 08:36:42,791 5585 DEBUG test urllib3: Added an stderr logging 
handler to logger: urllib3
2014-06-18 08:36:42,792 INFO Starting new HTTPS connection (1): 
some.host.com
2014-06-18 08:36:42,792 5585 INFO test urllib3.connectionpool: Starting new 
HTTPS connection (1): some.host.com
2014-06-18 08:36:43,699 DEBUG Setting read timeout to 10
2014-06-18 08:36:43,699 5585 DEBUG test urllib3.connectionpool: Setting read 
timeout to 10
2014-06-18 08:36:53,722 5585 ERROR test openerp.osv.osv: Uncaught exception
Traceback (most recent call last):
  File "/home/openerp/server/openerp/osv/osv.py", line 132, in wrapper
    return f(self, dbname, *args, **kwargs)
  File "/home/openerp/server/openerp/osv/osv.py", line 199, in execute
    res = self.execute_cr(cr, uid, obj, method, *args, **kw)
  File "/home/openerp/server/openerp/osv/osv.py", line 187, in execute_cr
    return getattr(object, method)(cr, uid, *args, **kw)
  File "/home/openerp/custom_addons/myaddon/xml_request/xml_request.py", 
  line 260, in button_test
    self.request(cr, uid, ids[0], data, context=context)
  File "/home/openerp/custom_addons/myaddon/xml_request/xml_request.py", 
  line 234, in request
    config_rec.xml_port, 'POST', api_url, vals)
  File "/home/openerp/custom_addons/myaddon/xml_request/xml_request.py", 
  line 208, in connAndReq
    timeout=urllib3.Timeout(connect=5, read=10))
  File "/usr/lib/python2.7/dist-packages/urllib3/request.py", line 79, in 
  request
    **urlopen_kw)
  File "/usr/lib/python2.7/dist-packages/urllib3/request.py", line 142, in 
  request_encode_body
    **urlopen_kw)
  File "/usr/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 
  574, in urlopen
    raise ReadTimeoutError(self, url, "Read timed out.")
ReadTimeoutError: HTTPSConnectionPool(host=u'some.host.com', port=443): Read 
timed out.

正如你所看到的,ReadTimeoutError 是在超时时间到后抛出的,没有进行重试。

1 个回答

4

看起来这是urllib3版本1.8.2中的一个错误。

这个问题应该在这里修复了,可以在master分支找到。

新的版本很快就会发布。抱歉给你带来了不便。:)

撰写回答