TATECHATLAS
◎ Deutsch
Programmierung

Python-Umgebungseinstellungen vor Start der Anwendung validieren

Fehlende und leere Einstellungen unterscheiden, Ports und Boolesche Werte explizit parsen und Konfigurationsfehler melden, ohne Geheimnisse preiszugeben.

Auf dieser Seite

Umgebungseinstellungen als Zeichenketten einlesen, einmalig vor Beginn der Anwendungsarbeit validieren und jede Einstellung gemäß einem expliziten Vertrag umwandeln. Ein fehlender Wert, ein leerer Wert und ein ungültiger Wert können unterschiedliche Reaktionen erfordern. Weder os.getenv noch configparser wählt die Konfigurationspriorität Ihrer Anwendung oder lädt automatisch eine .env-Datei.

Port mit einem festgelegten Vertrag parsen

Das folgende Beispiel der Standardbibliothek akzeptiert eine Zeichenkette oder None. Es verwendet int zur Umwandlung von Dezimalzahlen und prüft den inklusiven Bereich 1 bis 65535. Die festen Meldungen identifizieren das Problem, ohne den eingegebenen Wert wiederzugeben. Die Bereichsvalidierung beweist nicht, dass der Port verfügbar ist oder der Prozess die Berechtigung hat, ihn zu binden.

Abwesende Einstellung von einer leeren unterscheiden

Ohne Standardargument gibt os.getenv("PORT") None zurück, wenn PORT fehlt. Wenn die Variable existiert, aber einen leeren Wert hat, gibt sie eine leere Zeichenkette zurück. Prüfen Sie diese Zustände separat, wenn sie unterschiedliche Bedeutungen haben. Beispielsweise könnte ein fehlender optionaler Port einen Standard verwenden, während eine explizit leere erforderliche Einstellung einen Konfigurationsfehler erzeugen sollte.

Vermeiden Sie die Auswahl eines Standards mit raw oder default_value, es sei denn, diese Richtlinie behandelt alle leeren Zeichenketten absichtlich als fehlend. Lesen Sie eine Einstellung einmal in eine lokale Variable, damit das Parsen, die Fehlerberichterstattung und der anschließende Anwendungsstart denselben Wert verwenden.

def parse_port(raw):
    if raw is None:
        raise ValueError("PORT is missing")
    if not isinstance(raw, str):
        raise TypeError("PORT must be text")
    if not raw.strip():
        raise ValueError("PORT is empty")
    try:
        port = int(raw)
    except ValueError:
        raise ValueError("PORT must be an integer") from None
    if not 1 <= port <= 65535:
        raise ValueError("PORT is outside 1..65535")
    return port

for sample in ("8080", None, "", "wrong", "65536"):
    try:
        print(parse_port(sample))
    except ValueError as error:
        print(error)

Das beispielhafte Ergebnis korrekt lesen

Das Nachverfolgen der eingegebenen Werte ergibt 8080, dann PORT is missing, PORT is empty, PORT must be an integer und PORT is outside 1..65535. Dies sind erwartete Ergebnisse der gezeigten Logik, keine Meldung eines ausgeführten Bereitstellungstests. int akzeptiert auch einige Textformen wie umgebenden Leerraum; fügen Sie eine strengere lexikalische Regel hinzu, wenn Ihr Anwendungsvertrag eine solche benötigt.

Für den tatsächlichen Prozess importieren Sie os und übergeben os.getenv("PORT") an die Funktion. Halten Sie jede Richtlinie zur Auswahl eines optionalen Standards außerhalb des Parsers, damit klar ist, ob ein fehlende erforderliche Einstellung den Start stoppen sollte.

Boolesche Werte explizit interpretieren

bool("false") ist True, weil eine nicht leere Zeichenkette wahr ist. Normalisieren Sie stattdessen eine unterstützte textuelle Darstellung und suchen Sie sie in einer expliziten Zuordnung. Sie können true, yes, on und 1 als wahr akzeptieren und false, no, off und 0 als falsch; lehnen Sie andere Zeichenketten ab, statt eine Funktion stillschweigend zu aktivieren.

ConfigParser.getboolean(section, option) bietet solche Umwandlungen für Optionen in einem ConfigParser-Objekt. Es wandelt nicht automatisch eine Zeichenkette um, die von os.getenv stammt. Dies sind separate Schnittstellen.

Vor dem Beginn nützlicher Arbeit validieren

Sammeln Sie Einstellungen und validieren Sie sie, bevor Sie Datenbankverbindungen herstellen, einen Lauschsocket öffnen oder Hintergrundjobs starten. Geben Sie einen klaren Konfigurationsfehler an den Prozesssupervisor zurück. Das Abfangen jedes Fehlers und das Fortfahren mit geratenen Standards kann eine fehlerhafte Bereitstellung verbergen.

Behalten Sie nach der Validierung ein Konfigurationsobjekt mit umgewandelten Werten. Das wiederholte Lesen und Parsen eines Umgebungswerts in jeder Anfrage ist schwerer zu begründen und kann dazu führen, dass verschiedene Teile der Anwendung unterschiedliche Richtlinien verwenden.

Priorität in der eigenen Anwendung festlegen

Wenn eine Anwendung Kommandozeilenargumente, Umgebungsvariablen und eine INI-Datei verwendet, definieren Sie, welche Quelle gewinnt. Eine mögliche Richtlinie ist ein explizit übergebenes Argument, dann eine vorhandene Umgebungseinstellung, dann eine Dateioption, dann ein dokumentierter Standard. Dies ist eine Anwendungsentscheidung, keine eingebaute Reihenfolge, die von configparser durchgesetzt wird.

ConfigParser kann Dateien lesen und Optionenumwandlungen durchführen, aber es fügt nicht automatisch die Betriebssystemumgebung oder Kommandozeilenargumente zusammen. Beschreiben Sie eine .env-Datei nicht als bereits geladen, es sei denn, ein Starter oder eine explizite Bibliothek hat sie geladen.

Namen der Einstellung ohne ihren geheimen Wert melden

Protokollieren Sie den Namen und die Validierungskategorie, etwa DATABASE_URL is missing, ohne die Verbindungszeichenkette einzuschließen. Ein Token kann innerhalb einer URL auftreten, nicht nur in einer Einstellung, deren Name PASSWORD enthält. Vermeiden Sie das Ausgeben aller Umgebungsvariablen bei der Diagnose des Starts.

Für eine nicht geheime Einstellung entscheiden Sie separat, ob die Anzeige ihres Werts angemessen ist. Das Parserbeispiel verwendet feste Fehlermeldungen, um diese Unterscheidung einfach zu machen.

Verstehen, was Prozesskonfiguration verändert

os.environ repräsentiert die aktuelle Prozessumgebung und wird beim Import von os erfasst. Eine Aktualisierung verändert diesen Prozess und kann Kinder beeinflussen, die er startet; sie konfiguriert nicht einen bereits laufenden unabhängigen Prozess neu. Starten Sie den relevanten Dienst neu oder konfigurieren Sie ihn explizit, wenn Sie seine Bereitstellungseinstellungen ändern.

Das Betriebssystemverhalten unterscheidet sich, einschließlich der Groß- und Kleinschreibung von Namen unter Windows. Die Bytes-Umgebungsschnittstelle ist nur verfügbar, wo os.supports_bytes_environ dies erlaubt. Verwenden Sie die normale Zeichenkettenschnittstelle für die gewöhnliche Anwendungs Konfiguration, es sei denn, eine dokumentierte Plattformanforderung verlangt etwas anderes.

Was Sie prüfen sollten

  • Fehlende, leere, fehlerhaft formatierte und außerhalb des Bereichs liegende Einstellungen haben explizite Ergebnisse.
  • Die Anwendung definiert die Quellenpriorität statt anzunehmen, dass ein Parser Quellen zusammenführt.
  • Die Umwandlung von Booleschen Werten verwendet keine bool-Funktion auf einer rohen Umgebungszeichenkette.
  • Diagnosen identifizieren die Einstellung, ohne Zugangsdaten auszugeben.

Dieser Leitfaden behandelt die Prozesskonfiguration der Standardbibliothek. Er implementiert keinen .env-Lader, überprüft die Verfügbarkeit von Netzwerkports oder validiert Bereitstellungsberechtigungen. Anwendungsbezogene Anforderungen können weitere Validierung erfordern.

Quellen

  1. Python: os environment access ↗
  2. Python: configuration value conversion ↗
Nach oben ↑