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).

0
Akshay Shah 28 Aug. 2015 im 13:01

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.

0
GwynBleidD 28 Aug. 2015 im 10:48

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)
2
hspandher 28 Aug. 2015 im 12:02