超过HTTPSConnectionPool Max重试次数

Gev*_*ous 5 ssl python-requests

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

HTTPSConnectionPool(host='foobar.com', port=443): 
    Max retries exceeded with url: /foo/bar
Run Code Online (Sandbox Code Playgroud)

本质上发生的是我让浏览器与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)
Run Code Online (Sandbox Code Playgroud)

小智 9

您必须像这样禁用验证

requests.get('https://google.com', verify=False)
Run Code Online (Sandbox Code Playgroud)

您应该指定您的 CA。

  • 问题中的错误没有描述证书验证错误,并且在没有任何其他约束的情况下推荐“verify=False”是危险的,因为它允许 MITM 攻击者伪装成远程服务器。 (5认同)

Jay*_*ler 5

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

r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5)
Run Code Online (Sandbox Code Playgroud)

降级服务器出现连接问题,这引发了异常,并且冒泡了,并给了我您上面遇到的错误。我替换为:

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

并固定了它(当然,我建议添加更多错误处理,但以上是相关的子集)。