Verwendung von „while True“ beim Ausführen einer HTTP-Anfrage in Python 2.7
-
21-12-2019 - |
Frage
Gibt es eine pythonischere (2.7) Möglichkeit, den Server auf einen guten Statuscode (200) zu überprüfen, der die Verwendung nicht beinhaltet? while True
?Mein Codeausschnitt lautet wie folgt – und er wird oft aufgerufen:
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()
bearbeiten: Ich habe die „if“-Schleife in die Header-Fehler eingefügt.
Lösung
Sie können Ereigniehaken verwenden
generasacodicetagpre.Andere Tipps
Ich möchte diese Lösung:
generasacodicetagpre.weil:
generasacodicetagpre.weil ich es gelesen habe und es sofort verstehe.Mit Ereigniehaken ist dies nicht der Fall.Öffnen sie einen Thread, um Bytes parallel abzurufen?Wann sind sie angerufen?Muss ich die Daten selbst abrufen?
Ich verwende aspektorientierte Programmierung, indem ich Dekoratoren für Dinge wie Wiederholungsversuche anwende.Wenn meine Funktion zum Abrufen des gewünschten Werts so aussieht:
def getValue():
return requests.get('http://example.com')
Dann dekoriere ich diese Funktion, um den Wiederholungsmechanismus anzuwenden, ohne den ursprünglichen (naiven) Code zu beeinträchtigen:
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
Das Obige ist die Vorbereitung (Teil einer Dienstprogrammbibliothek), unten folgt die Verwendung:
@retryUntilCondition(responseIs200)
def getValue():
return requests.get('http://example.com')
Auf diese Weise die while
Die Schleife ist vollständig vor dem Anwendungscode verborgen und erschwert das Lesen nicht.Der Aspekt Die Anzahl der Wiederholungsversuche wird durch das Voranstellen eines einfachen Dekorators erhöht, der sogar in anderen Situationen wiederverwendet werden kann.
Wenn Sie später entscheiden, dass Sie es nur eine bestimmte Anzahl von Malen wiederholen möchten, unterschiedliche Verzögerungen haben usw., kann dies alles im implementiert werden retry
Dekorateur allein.