Das Problem bei den meisten dieser Lösungen ist, dass Sie entweder Ihre lokalen Einstellungen anwenden müssen vor die üblichen, oder nach sie.
Es ist also nicht möglich, Dinge außer Kraft zu setzen wie
- die env-spezifischen Einstellungen definieren die Adressen für den Memcached-Pool, und in der Haupteinstellungsdatei wird dieser Wert zur Konfiguration des Cache-Backends verwendet
- die env-spezifischen Einstellungen fügen Anwendungen/Middleware zum Standard hinzu oder entfernen sie
zur gleichen Zeit.
Eine Lösung kann durch die Verwendung von Konfigurationsdateien im "ini"-Stil mit der Klasse ConfigParser implementiert werden. Sie unterstützt mehrere Dateien, Lazy-String-Interpolation, Standardwerte und eine Menge anderer Goodies. Sobald eine Anzahl von Dateien geladen wurde, können weitere Dateien geladen werden, deren Werte die vorherigen überschreiben, falls vorhanden.
Sie laden eine oder mehrere Konfigurationsdateien, abhängig von der Rechneradresse, den Umgebungsvariablen und sogar den Werten in zuvor geladenen Konfigurationsdateien. Dann verwenden Sie einfach die geparsten Werte, um die Einstellungen auszufüllen.
Eine Strategie, die ich erfolgreich angewandt habe, war:
- Einen Standard laden
defaults.ini
fichier
- Überprüfen Sie den Rechnernamen und laden Sie alle Dateien, die mit dem umgekehrten FQDN übereinstimmen, von der kürzesten bis zur längsten Übereinstimmung (ich lud also
net.ini
entonces net.domain.ini
entonces net.domain.webserver01.ini
, wobei jede einzelne möglicherweise die Werte der vorherigen überschreibt). Dies gilt auch für die Rechner der Entwickler, so dass jeder seinen bevorzugten Datenbanktreiber usw. für die lokale Entwicklung einrichten kann.
- Prüfen Sie, ob ein "Clustername" deklariert ist, und laden Sie in diesem Fall
cluster.cluster_name.ini
die Dinge wie Datenbank- und Cache-IPs definieren kann
Als Beispiel dafür, was Sie damit erreichen können, können Sie einen "Subdomain"-Wert pro env definieren, der dann in den Standardeinstellungen verwendet wird (als hostname: %(subdomain).whatever.net
), um alle notwendigen Hostnamen und Cookies zu definieren, die Django benötigt, um zu funktionieren.
Dies ist die trockenste Lösung, die ich finden konnte, denn die meisten (bestehenden) Dateien hatten nur 3 oder 4 Einstellungen. Darüber hinaus musste ich die Kundenkonfiguration verwalten, also gab es einen zusätzlichen Satz von Konfigurationsdateien (mit Dingen wie Datenbanknamen, Benutzern und Passwörtern, zugewiesener Subdomain usw.), eine oder mehrere pro Kunde.
Man kann dies so niedrig oder so hoch wie nötig skalieren, man gibt einfach in der Konfigurationsdatei die Schlüssel an, die man pro Umgebung konfigurieren möchte, und sobald eine neue Konfiguration benötigt wird, setzt man den vorherigen Wert in die Standardkonfiguration und überschreibt ihn, wo nötig.
Dieses System hat sich als zuverlässig erwiesen und funktioniert gut mit der Versionskontrolle. Es wurde lange Zeit für die Verwaltung von zwei separaten Clustern von Anwendungen (15 oder mehr separate Instanzen der Django-Site pro Maschine) mit mehr als 50 Kunden verwendet, wobei die Cluster je nach Laune des Systemadministrators ihre Größe und Mitglieder änderten...