是否有更多的Pythonic(2.7)方法来检查服务器是否包含使用while True
的良好status_code(200)?我的代码片段如下 - 并且它被多次调用:
import time
import json
from datetime import datetime
import requests
while True:
response = requests.get('http://example.com')
if response.status_code != 200:
print 'sleeping:',str(datetime.now()),response.status_code
print 'sleeping:',str(datetime.now()),response.headers
time.sleep(5.0)
else: break
if "x-mashery-error-code" in response.headers:
return None
return response.json()
编辑:我将“if”循环包含在标题错误中。
答案 0 :(得分:3)
您可以使用Event Hooks
requests.get('http://example.com', hooks=dict(response=check_status))
def check_status(response):
if response.status_code != 200:
print 'not yet'
答案 1 :(得分:3)
我想要这个解决方案:
response = requests.get('http://example.com')
while response.status_code != 200:
print 'sleeping:',str(datetime.now()),response.status_code
print 'sleeping:',str(datetime.now()),response.headers
time.sleep(5.0)
response = requests.get('http://example.com')
由于:
>>> import this
...
Explicit is better than implicit.
Simple is better than complex.
...
Flat is better than nested.
...
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
...
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
...
因为我读了它并立刻明白了。对于事件挂钩,情况并非如此。他们是否打开一个并行检索字节的线程?他们什么时候打电话?我是否需要自己检索数据?
答案 2 :(得分:1)
我正在使用装饰器进行面向方面编程,例如进行重试。如果我获得我想要的值的函数看起来像这样:
def getValue():
return requests.get('http://example.com')
然后我正在修改此函数以应用重试机制而不会干扰原始(天真)代码:
def retryUntilCondition(condition):
def decorate(function):
def f(*args, **kwargs):
while True:
result = function(*args, **kwargs)
if condition(result):
return result
time.sleep(5.0)
return f
return decorate
def responseIs200(response):
return response.status_code == 200
以上是准备工作(实用程序库的一部分),下面是用法:
@retryUntilCondition(responseIs200)
def getValue():
return requests.get('http://example.com')
这样,while
循环对应用程序代码完全隐藏,并且不会使读取变得复杂。通过添加一个简单的装饰器来添加重试的方面,它甚至可以在其他情况下重复使用。
如果以后您决定只想重试特定次数,有不同的延迟等,所有这些都可以单独在retry
装饰器中实现。