解决HTTPS连接问题和MaxRetryError的策略

报错信息:
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证书的验证来尝试解决这些问题。

总之,你的解决方案提供了一种处理这种问题的策略,但确保始终考虑到安全性和资源管理的最佳实践。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值