Ich habe drei Systeme für mein Django-Projekt, für die ich drei verschiedene Einstellungsdateien für das jeweilige System benötige, d. H. Lokal, Staging und Produktion.
Nach einigen Recherchen habe ich mir überlegt, wie ich eine dem System entsprechende Umgebungsvariable einstellen kann. Für lokal setze ich die env-Variable als 'localsererver', für den Staging-Server setze ich 'staging' und so weiter für die Produktion.
Settings.py
server_environment = os.environ.get('XYZ_ENV')
if server_environment == 'staging':
try:
from rest_apis.settings_staging import *
except ImportError:
pass
elif server_environment == 'production':
try:
from settings_production import *
except ImportError:
pass
elif server_environment == 'localserver':
try:
from settings_local import *
except ImportError:
pass
local.py
from rest_apis.settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'xyz',
'USER': 'postgres',
'PASSWORD': 'postgres123',
'HOST': '127.0.0.1',
'PORT': 5432,
}
}
BROKER_URL = 'amqp://myuser:mypassword@127.0.0.1:5672//'
Gleiche Art der Konfiguration für verschiedene Systeme. Hier passiert, obwohl überprüft wird, ob der if-else-Block korrigiert wird, werden nicht die richtigen Einstellungen angewendet. Es wird immer eine Verbindung zum DB-Host hergestellt, der in der Datei Settings.py angegeben ist.
Auch wenn ich meine Instanz stoppe (ich habe eine private IP, damit sich die IP beim Neustart nicht ändert) und erneut starte, entsteht erneut das gleiche Problem.
Ich habe Stackoverflow dafür gemacht und verschiedene Lösungen dafür ausprobiert, aber keine davon hat geholfen. Was mache ich falsch ? Auch was ist der richtige Weg für diese Art von Situation. Ich möchte keine Hardcore-Änderungen am System vornehmen, indem ich mich bei jedem System anmelde (ssh).
2 Antworten
In dieser Einstellungsdatei wird zunächst davon ausgegangen, dass sich alle Ihre zusätzlichen Einstellungen in PYTHONPATH
befinden. Wenn sie sich nur im selben (Unter-) Modul befinden wie Ihre Haupteinstellungsdatei, verwenden Sie den relativen Import wie folgt:
server_environment = os.environ.get('XYZ_ENV')
if server_environment == 'staging':
try:
from rest_apis.settings_staging import *
except ImportError:
pass
elif server_environment == 'production':
try:
from .settings_production import *
except ImportError:
pass
elif server_environment == 'localserver':
try:
from .settings_local import *
except ImportError:
pass
Zweitens sollten sich die Importe am Ende Ihrer Einstellungsdatei befinden (es sei denn, Sie möchten einige Einstellungen haben, die nicht überlagert werden können. In diesem Fall sollten Sie sie unter Ihre Importe setzen).
Und zu guter Letzt stellen Sie sicher, dass Ihr Import erfolgreich ist. Entfernen Sie try - mit Ausnahme von Blöcken, und lassen Sie nur den Import in Ihrer Datei. Sie können auch Bedingungen entfernen. Importieren Sie einfach eine Datei, um zu testen, ob sie funktioniert.
Sie können verschiedene Umgebungen verwenden, wie in anderen Antworten vorgeschlagen. Ich empfehle jedoch, separate Einstellungsdateien für verschiedene Arbeitsumgebungen zu verwenden. Das ideale Projektlayout wäre so etwas wie -
project_folder -
settings -
__init__.py
common.py
development.py
staging.py
production.py
test.py
main.py
Die allgemeine Staging-Datei muss alle Einstellungen enthalten, die allen Umgebungen gemeinsam sind. Importieren aller Einstellungsdateien aus 'common.py'
Main.py importiert alle Einstellungen aus staging.py in der Staging-Umgebung, development.py in der Entwicklungsumgebung und Production.py in der Produktionsumgebung.
Somit wäre main.py die Haupteinstellungsdatei, die zu DJANGO_SETTINGS_MODULE hinzugefügt werden muss. Da main.py für verschiedene Umgebungen unterschiedlich ist, sollte es von git ausgeschlossen werden.
Beispielcode:-
Common.py
# All common configurations
Development.py
from .common import *
# Add settings for different connections like db, cache, smtp etc.
Production.py
from .common import *
# Add connection settings for production environment
Main.py # In der Entwicklungsumgebung
from .development import *
try:
from local import *
except ImportError:
pass
Main.py # In der Staging-Umgebung
from .staging import *
try:
from local import *
except ImportError:
pass
Main.py # In der Produktionsumgebung
from .production import *
try:
from local import *
except ImportError:
pass
Manage.py
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
settings_file = 'project_folder.settings.test' if 'test' in sys.argv else 'project_folder.settings.main'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", settings_file)
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.