Da das Thema routinemäßig wieder auftaucht, möchte ich zusammenfassen, warum Sie diesen Ansatz in Betracht ziehen sollten:
Eine dumme Einstellungsdatei ist sehr schnell und einfach zu ändern. vor allem in einer Produktionsumgebung. Kein Python erforderlich: Jeder Idiot kann das Datenbankkennwort in einer Datei ändern, in der nur Namen und Werte aufgelistet sind. vor allem im Vergleich zu einer komplexen Python-Einstellungsdatei voller mysteriöser gefährlicher BIGCAPS-Namen.
Die Anwendung settings
sollte vollständig von der Anwendung getrennt sein code
. Sie können eine config.ini außerhalb des Repository-Stammverzeichnisses ablegen und sich nie wieder Sorgen machen, dass ein Repo-Pull Ihre Einstellungen oder Ihre persönlichen Einstellungen, die das Repo verschmutzen, oder dieser clevere Code in Ihren settings.py nicht zum Vorteil aller anderen in das Repo schafft .
Dies gilt nicht für kleine Projekte, aber bei größeren Projekten bin ich zu dem Schluss gekommen, dass die Strategie local_settings es einfach nicht schafft. Mit der Zeit schleicht sich genug Anwendungsprogrammierung ein, so dass es schwierig wird, damit umzugehen. in erster Linie, wenn Einstellungen abgeleitet und / oder codependent werden. Es kann gute Gründe dafür geben, dass die Einstellungen entsprechend den lokalen Einstellungen reagieren, wodurch der Import einer local_settings
Datei in die Mitte gezwungen wird settings.py
. Ich finde, die Dinge werden langsam chaotisch, wenn das passiert.
Meine aktuelle Lösung besteht darin, eine config
Datei zu verwenden. Ich nenne sie "local.ini". Es enthält nur die Werte, die sich zwischen den bereitgestellten Instanzen tatsächlich ändern. Es gibt keinen Code: Sie sind nur Werte und Boolesche Werte:
[global]
domain = 127.0.0.1:8000
database_host = 127.0.0.1
database_name = test_database
debug = Yes
google_analytics_id = UA-DEV-1
payments = testing
use_cdn = No
Mit dieser Funktion kann ich das Gleiche settings.py
wie jeden anderen Anwendungscode behandeln: Optimieren, Einchecken und Bereitstellen, ohne mir Gedanken über das Testen des Codes machen zu müssen, der möglicherweise in einem Python-Code von local_settings lauert. Mein settings.py
ist frei von Rennbedingungen, die auftreten, wenn spätere Einstellungen von lokalen Einstellungen abhängen, und ich kann Funktionen ein- und ausschalten, indem ich einfach zu befolgenden linearen Code schreibe. Keine Eile mehr zwicken die local_settings Datei , wenn ich vergessen habe einigen neuen Mehrwert zu schaffen , und nicht mehr daves_local_settings.py
und bobs_local_settings.py
Dateien in das Repository kriechen.
from ConfigParser import RawConfigParser
parser = RawConfigParser()
APPLICATION_ROOT = path.abspath(path.dirname(__file__))
parser.readfp(open(path.join(APPLICATION_ROOT, 'local.ini')))
DATABASE_HOST = parser.get('global', 'database_host')
DATABASE_NAME = parser.get('global', 'database_name')
from version import get_cdn_version
CDN = 'd99phdomw5k72k.cloudfront.net'
if parser.getboolean('global', 'use_cdn'):
STATIC_URL = '/{}/static/{}/'.format(CDN, get_cdn_version())
else:
STATIC_URL = '/static/'
payments = parser.get('global', 'payments')
if payments == 'testing':
PAYMENT_GATEWAY_ENDPOINT = 'https://api.sandbox.gateway.com'
else:
PAYMENT_GATEWAY_ENDPOINT = 'https://api.live.gateway.com'
Wenn Sie auf ein BOFH stoßen , wie ich es einmal getan habe, war er besonders begeistert von der Möglichkeit, das local.ini
als /etc
Verzeichnis in das Verzeichnis zu stecken /etc/ourapp.ini
und so das Anwendungsverzeichnis selbst als reinen Repository-Export zu halten. Sicher, Sie könnten das mit einer local_settings.py machen, aber das Letzte, was er tun wollte, war, sich mit Python-Code herumzuschlagen. Eine einfache Konfigurationsdatei, mit der er umgehen konnte.