HTTPSConnectionPool超出最大重试次数

时间:2013-04-26 07:21:18

标签: ssl python-requests

我在nginx / uwsgi上运行了django app。我们最近开始为所有连接使用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)

3 个答案:

答案 0 :(得分:4)

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

r = requests.post(url, data=json.dumps(payload), headers=headers, timeout=5)

downrange服务器遇到了连接问题,它引发了一个异常并且冒出来并给了我上面的错误。我替换为:

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

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

答案 1 :(得分:0)

您必须禁用这样的验证

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

您应该指定您的CA。

答案 2 :(得分:0)

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