轮询 API 端点 - 当未返回 JSON 时如何重试?
Polling an API endpoint - how do I retry when no JSON is returned?
我正在使用 while 循环轮询 API 端点,该循环检查 JSON returns None 上是否有 .get() 方法:
while requests.get(render_execution_url, headers=headers).json().get('finalized_at') is None:
status = requests.get(render_execution_url, headers=headers).json().get('status')
status_detail = requests.get(render_execution_url, headers=headers).json().get('status_detail')
logger.info("status for {} is {}. detailed status is {}".format(render_execution_url, status, status_detail))
这里的想法是我们不断轮询端点,直到 "finalized_at" 值被填充。
不幸的是,当 JSON 根本不存在时,我们会定期出现故障:
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
我试过在方法上使用重试装饰器(装饰器语法见下文),但当我遇到此故障时它似乎没有执行重试。
@retry(stop_max_attempt_number=7, wait_fixed=10000)
当 JSON 不存在时,是否有一种优雅的 Pythonic 方式来处理这种情况(即,在一段时间后重试)?
您的代码过于密集,无法轻松区分您需要处理的不同情况,因此您的错误报告没有明确说明 "when the JSON doesn't exist at all" 的确切含义 - 服务器是否返回 404(Page Not找到),或者响应数据是空的,还是别的?
这是一个重写,每次访问 JSON 都不会访问 URL。它可能无法完全满足您的需求,但它应该能让您入门。
while True:
resp = requests.get(render_execution_url, headers=headers)
# I assume response status is always 200 or 204 -
# Really easy to detect a 404 here if that happens.
if not resp.data:
time.sleep(WAIT_TIME)
continue
rj = resp.json()
if rj.get('finalized_at') is not None:
break
status = rj.get('status')
status_detail = rj.get('status_detail')
logger.info("status for {} is {}. detailed status is {}"
.format(render_execution_url, status, status_detail))
time.sleep(WAIT_TIME)
我正在使用 while 循环轮询 API 端点,该循环检查 JSON returns None 上是否有 .get() 方法:
while requests.get(render_execution_url, headers=headers).json().get('finalized_at') is None:
status = requests.get(render_execution_url, headers=headers).json().get('status')
status_detail = requests.get(render_execution_url, headers=headers).json().get('status_detail')
logger.info("status for {} is {}. detailed status is {}".format(render_execution_url, status, status_detail))
这里的想法是我们不断轮询端点,直到 "finalized_at" 值被填充。
不幸的是,当 JSON 根本不存在时,我们会定期出现故障:
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
我试过在方法上使用重试装饰器(装饰器语法见下文),但当我遇到此故障时它似乎没有执行重试。
@retry(stop_max_attempt_number=7, wait_fixed=10000)
当 JSON 不存在时,是否有一种优雅的 Pythonic 方式来处理这种情况(即,在一段时间后重试)?
您的代码过于密集,无法轻松区分您需要处理的不同情况,因此您的错误报告没有明确说明 "when the JSON doesn't exist at all" 的确切含义 - 服务器是否返回 404(Page Not找到),或者响应数据是空的,还是别的?
这是一个重写,每次访问 JSON 都不会访问 URL。它可能无法完全满足您的需求,但它应该能让您入门。
while True:
resp = requests.get(render_execution_url, headers=headers)
# I assume response status is always 200 or 204 -
# Really easy to detect a 404 here if that happens.
if not resp.data:
time.sleep(WAIT_TIME)
continue
rj = resp.json()
if rj.get('finalized_at') is not None:
break
status = rj.get('status')
status_detail = rj.get('status_detail')
logger.info("status for {} is {}. detailed status is {}"
.format(render_execution_url, status, status_detail))
time.sleep(WAIT_TIME)