python请求:重试直到收到有效响应

时间:2014-11-21 13:04:05

标签: python exception python-requests

我想知道是否有一个共同模式重试请求一定次数(由于服务器错误或网络不良可能会失败)。我想出了这个,我愿意在那里找到更好的实现。

cnt=0
while cnt < 3:
    try:
        response = requests.get(uri)
        if response.status_code == requests.codes.ok:
            return json.loads(response.text)
    except requests.exceptions.RequestException:
        continue
    cnt += 1
return False

1 个答案:

答案 0 :(得分:4)

您可能需要考虑在重试之间引入等待,因为很多瞬态问题可能需要几秒钟才能清除。另外,我建议等待时间几何增加,以便有足够的时间让系统恢复:

import time

cnt=0
max_retry=3
while cnt < max_retry:
    try:
        response = requests.get(uri)
        if response.status_code == requests.codes.ok:
            return json.loads(response.text)
        else:
            # Raise a custom exception
    except requests.exceptions.RequestException as e:
        time.sleep(2**cnt)
        cnt += 1
        if cnt >= max_retry:
            raise e

在这种情况下,您的重试将在1秒,2秒和4秒后发生。请注意最大重试次数。你将重试次数增加到10,接下来就知道代码将等待17分钟。

修改

仔细研究一下你的代码,当你用尽重试时返回false真的没有意义。您应该真正向调用者提出异常,以便可以传达问题。另外,您检查requests.codes.ok但没有else操作定义。