我正在构建一个名为API的web应用程序。我目前使用的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发布于 2013-08-08 17:00:35
您正在将repr()输出与对象混淆。
响应对象有一个属性,对此进行测试:
if r.status_code == 200:
break然而,反复敲击一个服务,直到它给你200个响应,很可能会阻塞您的IP地址。内置某种指数后退,以防止对API的监督。
发布于 2016-12-01 19:17:48
我刚刚在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')https://stackoverflow.com/questions/18131761
复制相似问题