Ssl 已超过HTTPSConnectionPool最大重试次数

Ssl 已超过HTTPSConnectionPool最大重试次数,ssl,python-requests,Ssl,Python Requests,我有一个django应用程序正在nginx/uwsgi上运行。我们最近开始对所有连接使用SSL。自从转到SSL后,我经常收到以下消息: HTTPSConnectionPool(host='foobar.com', port=443): Max retries exceeded with url: /foo/bar 实际上,我让浏览器与django服务器代码通信,然后使用请求库调用api。它是与生成错误的api的连接。此外,我已经将所有请求移到一个会话(即请求会话)中,但这没有帮助 我

我有一个django应用程序正在nginx/uwsgi上运行。我们最近开始对所有连接使用SSL。自从转到SSL后,我经常收到以下消息:

HTTPSConnectionPool(host='foobar.com', port=443): 
    Max retries exceeded with url: /foo/bar
实际上,我让浏览器与django服务器代码通信,然后使用请求库调用api。它是与生成错误的api的连接。此外,我已经将所有请求移到一个会话(即请求会话)中,但这没有帮助

我已经增加了uwsgi侦听器的数量,因为我认为这可能是问题所在,但我们的负载并没有那么高。而且,在SSL之前,我们从未遇到过这个问题。有人对如何解决这个问题有什么建议吗

编辑

我如何调用API的代码片段。我(大部分)一字不差地把它贴了出来。请注意,实际失败的不是代码,而是调用
self.session.post时引发异常的请求库

def save_answer(self):
    logger.info("Saving answer to question")
    url = "%s1.0/exam/learneranswer/" % self.api_url
    response = {'success': False}

    data = {'questionorder': self.request.POST.get('questionorder'),
            'paper': self.request.POST.get('paper')}
    data['answer'] = ",".join(self.request.POST.getlist('answer'))
    r = self.session.post(url, data=simplejson.dumps(data))
    if r.status_code == 201:
        logger.info("Answer saved successfully")
        response['success'] = True
    elif r.status_code == 400:
        if r.text == "Paper expired":
            logger.warning("Timer has expired")
            response['message'] = 'Your time has run out'
        if r.text == "Question locked":
            response['message'] = \
                'This question is locked and cannot be answered anymore'
        else:
            logger.error("Unknown error")
            self.log_error(r, "Unknown Error while saving answer")
    else:
        logger.error("Internal error")
        self.log_error(r, "Internal error in api while saving answer")
    return simplejson.dumps(response)

我发现当我的一个视图中的某个项抛出异常时,就会发生此错误。例如,当使用django“requests”框架将数据发布到另一个URL时:

r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5)
下行服务器出现连接问题,引发了一个异常,出现了一个冒泡,并给出了上面的错误。我将其替换为:

try:
    r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5)
except requests.exceptions.ConnectionError as e:
    r = "No response"

这就解决了它(当然,我建议添加更多的错误处理,但上面是相关的子集)。

您必须像这样禁用验证

requests.get('https://google.com', verify=False)

您应该指定您的CA。

即使在建立wifi或以太网连接之前,python脚本仍试图连接到IBM服务,因此会发生此错误。请尝试/捕获以进行纠正,或者如果尝试作为服务运行,请在网络建立后运行服务。

向我们显示您的请求代码和nginx配置。事实上,您可以尝试设置一个静态html,让nginx指向它,使用请求来显示它,以验证这与nginx有关,而不是与django有关。问题并不局限于特定的代码区域。它发生在不同的部位。主要是在一个部分,因为它是最常用的,但有时也在其他部分。我已经更新了我的问题,添加了一段代码。请求是否确实对视图进行了修改?它通过nginx了吗?nginx是否将请求移交给Django实例?url是否正常工作?对我来说,这些都是需要问的重要问题。这个错误可能会产生误导,并且可能无法提供它失败的原因。另外,第三行
url=“1.0/exam/learneranswer/%self.api\u url
字符串中应该有一个占位符,不是吗?我修复了占位符。正如我所提到的,代码主要起作用。我发现它有2%的时间失败,我不知道什么时候或者为什么。我也不确定失败的请求是否通过nginx。我将检查服务器日志,看看是否找到与错误对应的内容。您使用的是什么版本的请求?如果不是1.2.0,请升级?问题中的错误没有描述证书验证错误,建议在没有任何其他约束的情况下
verify=False
,这是危险的,因为它允许MITM攻击者伪装成远程服务器。这对我的本地测试很有效