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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top