首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重试<Response [404]>直到我得到<Response [200]> ]

重试<Response [404]>直到我得到<Response [200]> ]
EN

Stack Overflow用户
提问于 2013-08-08 16:57:17
回答 2查看 6.7K关注 0票数 1

我正在构建一个名为API的web应用程序。我目前使用的API (它波动)的重生时间(可能不是正确的术语)为210秒。

请求中的API调用是:

代码语言:javascript
复制
r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))

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

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

代码语言:javascript
复制
while True:
    r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
    if (r == '<Response [200]>'): break
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-08 17:00:35

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

响应对象有一个属性,对此进行测试:

代码语言:javascript
复制
if r.status_code == 200:
    break

然而,反复敲击一个服务,直到它给你200个响应,很可能会阻塞您的IP地址。内置某种指数后退,以防止对API的监督。

票数 7
EN

Stack Overflow用户

发布于 2016-12-01 19:17:48

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

您可以尝试使用请求HTTPAdapter。下面这样的东西应该能起作用:

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18131761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档