【问题标题】:Retry <Response [404]> until I get <Response [200]>重试 <Response [404]> 直到我得到 <Response [200]>
【发布时间】:2013-08-08 16:57:17
【问题描述】:

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

请求中的 API 调用是:

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

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

我当前的循环如下。有没有更好的方法来做到这一点?

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

【问题讨论】:

  • 您知道,我在您的问题中将“Django”的提及更改为“请求”。您提出的问题与您用来拨打电话的 "requests" 库有关。我不确定 Django 在哪里发挥作用(也许它被您调用的 API 使用,或者您的代码作为 Django 应用程序的一部分运行),但您的问题实际上是关于 requests 库的工作原理。跨度>

标签: python django http response python-requests


【解决方案1】:

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

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

if r.status_code == 200:
    break

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

【讨论】:

  • 我在阅读这个答案时迟到了大约 5 分钟。是的,我敲了系统。感谢您的回复。我需要找到一种方法让循环延迟 60 秒
  • @IdeoREX: time.sleep(60),但这对网络不太友好。使用以增加间隔重新安排自身的异步任务(也许使用 Celery)。
【解决方案2】:

我刚刚在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')

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多