如何在 python 中等待特定的 http 响应
How to wait for a specific http response in python
我在等待响应 200 时遇到问题。当我执行 get 请求时,预期的资源不存在,响应为 204。
我想要做的是等待两分钟,假设每 10 秒调用一次以检查响应是否为 200。如果时间到了,我想 return 一个错误。
def waitForResourceAvailable(response):
while response.status_code == 204:
time.sleep(10)
if response.status_code == 200:
break
这很好用,但我需要一个解决方案来退出循环,以防状态码 200 未在指定时间出现。
请注意 如果在检查 while
条件时响应的值发生变化,它也会停止迭代,因此 while 中的 if 语句是不需要。
注意: 响应对象必须能够更改其值,否则它将始终相同,因为它只是一个变量而不是检查响应的函数
您可以添加带有时间值的简单if
语句
def waitForResourceAvailable(response, time):
timer = 0
while response.status_code == 204:
time.sleep(10)
timer += 10
if timer > time:
break
if response.status_code == 200:
break
让它变得更好就像:
def waitForResourceAvailable(response, timeout, timewait):
timer = 0
while response.status_code == 204:
time.sleep(timewait)
timer += timewait
if timer > timeout:
break
if response.status_code == 200:
break
查看 backoff 库。您可以注释您的功能,以便在请求失败时;它将“退避”并重试。下面是一个简单的示例,但它可以扩展为更复杂的用例,例如:放弃条件、抖动、使用多个装饰器等。
@backoff.on_exception(backoff.expo,
(requests.exceptions.Timeout,
requests.exceptions.ConnectionError))
def get_url(url):
return requests.get(url)
on_exception装饰器用于在引发指定异常时重试。这是在引发任何请求异常时使用指数退避的示例:
我在等待响应 200 时遇到问题。当我执行 get 请求时,预期的资源不存在,响应为 204。 我想要做的是等待两分钟,假设每 10 秒调用一次以检查响应是否为 200。如果时间到了,我想 return 一个错误。
def waitForResourceAvailable(response):
while response.status_code == 204:
time.sleep(10)
if response.status_code == 200:
break
这很好用,但我需要一个解决方案来退出循环,以防状态码 200 未在指定时间出现。
请注意 如果在检查 while
条件时响应的值发生变化,它也会停止迭代,因此 while 中的 if 语句是不需要。
注意: 响应对象必须能够更改其值,否则它将始终相同,因为它只是一个变量而不是检查响应的函数
您可以添加带有时间值的简单if
语句
def waitForResourceAvailable(response, time):
timer = 0
while response.status_code == 204:
time.sleep(10)
timer += 10
if timer > time:
break
if response.status_code == 200:
break
让它变得更好就像:
def waitForResourceAvailable(response, timeout, timewait):
timer = 0
while response.status_code == 204:
time.sleep(timewait)
timer += timewait
if timer > timeout:
break
if response.status_code == 200:
break
查看 backoff 库。您可以注释您的功能,以便在请求失败时;它将“退避”并重试。下面是一个简单的示例,但它可以扩展为更复杂的用例,例如:放弃条件、抖动、使用多个装饰器等。
@backoff.on_exception(backoff.expo,
(requests.exceptions.Timeout,
requests.exceptions.ConnectionError))
def get_url(url):
return requests.get(url)
on_exception装饰器用于在引发指定异常时重试。这是在引发任何请求异常时使用指数退避的示例: