重试<response [404] =“”>直到我得到<response [200] =“”> </response> </response>

时间:2013-08-08 16:57:18

标签: python django http response python-requests

我正在构建一个调用API的网络应用。我目前正在使用的API(它波动)有一个210秒的重生时间(可能不是正确的术语)。

请求中的API调用是:

r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))

通话后r可以等于<Response [404]><Response [200]>。我想运行此API调用,直到它返回<Response [200]><Response [200]>的格式是什么?

我目前的循环如下。有更好的方法吗?

while True:
    r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
    if (r == '<Response [200]>'): break

2 个答案:

答案 0 :(得分:6)

您将repr()输出与对象混淆。

响应对象有一个.status_code attribute,对此进行测试:

if r.status_code == 200:
    break

但是,要反复敲定服务直到它给出200响应,可能会阻止您的IP地址。构建某种exponential back-off以防止对API进行DOS操作。

答案 1 :(得分:0)

我刚刚在https://stackoverflow.com/a/40918529/2398354分享了一个可能值得重复的解决方案。

您可以尝试使用HTTPAdapter请求。以下内容应该有效:

import time
import httplib

import requests
from requests.adapters import HTTPAdapter


class RetryHTTPAdapter(HTTPAdapter):

    SECONDS_BETWEEN_RETRIES = 5

    def __init__(self, retry_time=120, *args, **kwargs):
        self.retry_time = retry_time
        super(RetryHTTPAdapter, self).__init__(*args, **kwargs)

    def send(self, *args, **kwargs):
        for _ in range(int(self.retry_time / self.SECONDS_BETWEEN_RETRIES)):
            response = super(RetryHTTPAdapter, self).send(*args, **kwargs)
            if response.status_code == httplib.OK:
                break
            time.sleep(self.SECONDS_BETWEEN_RETRIES)
        return response

s = requests.Session()
s.mount('http://', RetryHTTPAdapter(retry_time=180))
s.mount('https://', RetryHTTPAdapter(retry_time=180))

s.get('http://example.com')