在Python 2.7中执行http请求时使用'while True'

时间:2014-02-26 08:41:08

标签: python python-2.7 python-requests

是否有更多的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”循环包含在标题错误中。

3 个答案:

答案 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装饰器中实现。