2014-02-26 59 views
1

是否有更多Pythonic(2.7)方法來檢查服務器是否有一個不包含使用while True的好status_code(200)?我的代碼片段如下 - 這就是所謂的很多次:在Python 2.7中執行http請求時使用'while True'

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() 

編輯:我包含在標題錯誤的「如果」循環。

+0

此代碼是否有用來檢查服務器的運行狀況? – praveen

+0

@praveen不,我需要response.json()中的數據。但服務器有一個油門限制,也可能發送非200代碼。 – philshem

+0

使用'while 1:'如果'True:'就是這個問題。但是真正的問題是什麼?你能寫更多關於這個嗎? – User

回答

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. 
... 

因爲我讀它,理解它的時候了。事件掛鉤事件並非如此。他們是否打開一個線程來並行檢索字節?他們什麼時候打電話?我需要自己檢索數據嗎?

+0

我喜歡它,但不會增加請求的數量服務器? – philshem

+0

該解決方案存在將代碼翻倍的主要缺點。如果URL後來發生變化,那麼您忘記在兩個地方調整它的機會是很好的(考慮到這些地方會進一步分離)。 – Alfe

+1

@philshem它完全符合你的代碼。 @ Alfe我想你可以將它重構成一個變量。或者你將整個請求重構爲一個函數。你能行的。 – User

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' 
+0

非常好。睡眠聲明也可以進入'if'循環? – philshem

+0

嗯,我不認爲你真的需要睡覺......你用這種方式發出請求異步。如果你想等到請求完成,你可以簡單地爲下一個URL調用另一個方法,當它達到狀態200.你應該嘗試不同的想法;) –

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環完全從APPLICA隱藏而且不會讓閱讀變得複雜。重試的方面通過預先添加一個簡單的修飾器來添加,該修飾器甚至可以在其他情況下重用。

如果稍後您決定只想重試特定次數,有不同的延遲等,所有這些都可以在retry修飾器中實現。

+0

這是一個非常優雅的解決方案,但我需要其他人稍後可以修改的內容。 – philshem