赞
踩
报错信息: raise MaxRetryError(_pool, url, error or ResponseError(cause))\nurllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='172.17.0.1', port=443): Max retries exceeded with url: /api/events/rule/?page_size=20&lock_id=140351160399616 (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:877)'),)) 原因分析: 参数 verify=False,同时,requests默认是keep-alive的,可能没有释放, 解决方案: 加参数
- sess = requests.Session()
- sess.mount('http://', HTTPAdapter(max_retries=3))
- sess.mount('https://', HTTPAdapter(max_retries=3))
- sess.keep_alive = False # 关闭多余连接
-
- text = requests.get(self.target_img_url, headers=headers, stream=True, verify=False, timeout=(5,5)) # connect 和 read 二者的 timeout,所以是一个数组
-
- text.close() # 关闭,很重要,确保不要过多的链接
从给出的报错信息来看,问题出现在尝试通过HTTPS连接到某个服务器时,超过了最大重试次数,导致`MaxRetryError`。 报错信息中还提到了`SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:877)')`,这通常意味着在SSL/TLS握手过程中出现了问题,可能是由于服务器端意外关闭了连接,或者客户端和服务器之间的SSL/TLS协议版本不匹配。 关于你给出的解决方案,我会逐一分析: 1. **参数 verify=False**: 当使用`verify=False`时,requests不要验证SSL证书。这可能会使连接容易受到中间人攻击,所以通常不推荐这样做,除非完全信任目标服务器并且了解潜在的安全风险。 2. **requests默认是keep-alive的**: 是的,requests默认使用keep-alive来复用连接,这有助于提高性能和减少资源消耗。但有时,如果之前的请求未能正确关闭,可能会导致资源泄露或与服务器建立过多连接。 3. **解决方案中的代码**: * 使用`requests.Session()`创建了一个会话。会话有助于管理HTTP连接,特别是当你想复用连接时。 * 使用`HTTPAdapter(max_retries=3)`设置了最大重试次数为3。这确保了当与服务器通信出现问题时,requests会尝试重新连接。 * `sess.keep_alive = False`确保了即使使用了会话,也不会保持多余的连接。这在某些情况下可能是必要的,特别是当服务器或网络环境不稳定时。 * `text = requests.get(...)`:这里设置了多个参数,包括`verify=False`、`stream=True`等。这些参数会影响请求的行为。 * `text.close()`:确保请求完成后关闭响应对象。这是一个好习惯,可以确保及时释放资源。 **举例说明**: 假设你有一个Web应用,该应用通过HTTPS提供服务。用户A通过requests库发起请求,但由于某种原因(如网络波动、服务器故障等),请求未能成功完成。如果A没有正确处理异常或重试机制,可能会立即重试请求。但由于SSL握手失败或其他原因,重试也可能会失败。随着越来越多的用户(B、C、D...)尝试访问该服务,但由于相同的原因失败,最终可能会导致MaxRetryError。 解决方案中的代码通过设置最大重试次数、关闭不必要的连接以及对SSL证书的验证来尝试解决这些问题。 总之,你的解决方案提供了一种处理这种问题的策略,但确保始终考虑到安全性和资源管理的最佳实践。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。