Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重试直到我得到_Python_Django_Http_Response_Python Requests - Fatal编程技术网

Python 重试直到我得到

Python 重试直到我得到,python,django,http,response,python-requests,Python,Django,Http,Response,Python Requests,我正在构建一个调用API的web应用程序。我目前使用的API有一个重生时间,可能不是正确的210秒 请求中的API调用为: r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data)) 调用后,r可以等于或。我想运行这个API调用,直到它返回一个。是什么格式的 我当前的循环如下。有更好的方法吗 while True: r = requests.post(url ,headers=headers, au

我正在构建一个调用API的web应用程序。我目前使用的API有一个重生时间,可能不是正确的210秒

请求中的API调用为:

r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
调用后,r可以等于或。我想运行这个API调用,直到它返回一个。是什么格式的

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

while True:
    r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
    if (r == '<Response [200]>'): break
您将repr输出与对象混淆

响应对象有一个针对以下内容的测试:

if r.status_code == 200:
    break
然而,反复敲打一个服务直到它给出200个响应,很可能会阻止你的IP地址。内置某种类型的API,以防止破坏API。

您将repr输出与对象混淆

响应对象有一个针对以下内容的测试:

if r.status_code == 200:
    break

然而,反复敲打一个服务直到它给出200个响应,很可能会阻止你的IP地址。内置某种类型的API以防止破坏API。

我刚刚分享了一个解决方案,这里可能值得重复

您可以尝试使用请求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')

我刚刚分享了一个可能值得在此重复的解决方案

您可以尝试使用请求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')

正如你所知,我在你的问题中将提到Django改为请求。你问的问题与你用来打电话的图书馆有关。我不确定Django在这里起到了什么作用,可能是您调用的API使用了Django,或者您的代码作为Django应用程序的一部分运行,但您的问题实际上是关于请求库如何工作的。正如您所知,我在您的问题中将Django改为请求。你问的问题与你用来打电话的图书馆有关。我不确定Django在这里起到了什么作用,可能是您调用的API使用了它,或者您的代码作为Django应用程序的一部分运行,但您的问题实际上是关于请求库是如何工作的。我在阅读此答案时晚了大约5分钟。是的,我敲定了这个系统。谢谢你的回复。我需要找到一种方法,让时间延迟60秒loop@IdeoREX:time.sleep60,但这对网络不太友好。使用一个异步任务,通过增加芹菜的间隔来重新安排自己。我在阅读这个答案时晚了大约5分钟。是的,我敲定了这个系统。谢谢你的回复。我需要找到一种方法,让时间延迟60秒loop@IdeoREX:time.sleep60,但这对网络不太友好。使用一个异步任务,该任务可能会使用芹菜,以增加的间隔重新安排自己。