Ich habe eine Basis-App entwickelt. In der Bereitstellungsphase wurde klar, dass ich sowohl lokale Einstellungen als auch Produktionseinstellungen benötige.
Es wäre toll, Folgendes zu wissen:
- Wie man am besten mit Entwicklungs- und Produktionseinstellungen umgeht.
- So behalten Sie Apps wie die Django-Debug-Symbolleiste nur in einer Entwicklungsumgebung.
- Alle anderen Tipps und Best Practices für Entwicklungs- und Bereitstellungseinstellungen.
Antworten:
Die
DJANGO_SETTINGS_MODULE
Umgebungsvariable steuert, welche Einstellungsdatei Django geladen wird.Sie erstellen daher separate Konfigurationsdateien für Ihre jeweiligen Umgebungen (beachten Sie, dass diese natürlich beide
import *
aus einer separaten Datei mit gemeinsam genutzten Einstellungen stammen können) undDJANGO_SETTINGS_MODULE
steuern, welche verwendet werden soll.Hier ist wie:
Wie in der Django-Dokumentation angegeben:
Nehmen wir also an, Sie haben
myapp/production_settings.py
undmyapp/test_settings.py
in Ihrem Quell-Repository erstellt.In diesem Fall würden Sie jeweils
DJANGO_SETTINGS_MODULE=myapp.production_settings
die erstere undDJANGO_SETTINGS_MODULE=myapp.test_settings
die letztere verwenden.Von hier an läuft das Problem darauf hinaus, die
DJANGO_SETTINGS_MODULE
Umgebungsvariable festzulegen.Einstellung
DJANGO_SETTINGS_MODULE
mit einem Skript oder einer ShellSie können dann ein Bootstrap-Skript oder einen Prozessmanager verwenden, um die richtigen Einstellungen zu laden (indem Sie die Umgebung festlegen), oder sie einfach von Ihrer Shell aus ausführen, bevor Sie Django starten :
export DJANGO_SETTINGS_MODULE=myapp.production_settings
.Beachten Sie, dass Sie diesen Export jederzeit über eine Shell ausführen können - er muss nicht in Ihrer
.bashrc
oder einer anderen Umgebung leben.Einstellung
DJANGO_SETTINGS_MODULE
mit einem ProzessmanagerWenn Sie nicht gerne ein Bootstrap-Skript schreiben, das die Umgebung festlegt (und es gibt sehr gute Gründe, sich so zu fühlen!), Würde ich die Verwendung eines Prozessmanagers empfehlen:
environment
Konfigurationsschlüssels eines Programms an verwaltete Prozesse übergeben ..env
) - Datei definieren .Schließlich , dass Anmerkung Sie können die Vorteile des nehmen
PYTHONPATH
Variable die Einstellungen in einem ganz anderen Ort zu speichern (zB auf einem Produktionsserver, speichern sie in/etc/
). Dies ermöglicht das Trennen der Konfiguration von Anwendungsdateien. Sie können das wollen oder nicht, es hängt davon ab, wie Ihre App strukturiert ist.quelle
settings.py
DateiSiteName/settings.py
standardmäßig gespeichert ist , sollte zur Verdeutlichung, wenn Sie Ihre alternativen Einstellungsdateien in demselben Verzeichnis ablegen, die zu bin / activ hinzugefügte Zeile lauten.DJANGO_SETTINGS_MODULE="SiteName.test_settings"
Andernfalls ausgezeichnete Antwort!DJANGO_SETTINGS_MODULE
Wählen Sie die gewünschte aus. Das Ändernbin/activate
ist eine, um Letzteres zu tun (TBH, ich denke nicht, dass dies sowieso eine gute Idee ist, also habe ich das herausgenommen), aber es ist nicht die einzige.Verwenden Sie standardmäßig die Produktionseinstellungen, erstellen Sie jedoch eine Datei, die
settings_dev.py
im selben Ordner wie Ihresettings.py
Datei aufgerufen wird . Fügen Sie dort Überschreibungen hinzu, zDEBUG=True
.Fügen Sie auf dem Computer, der für die Entwicklung verwendet wird, Folgendes zu Ihrer
~/.bashrc
Datei hinzu:Fügen Sie am Ende Ihrer
settings.py
Datei Folgendes hinzu.(Beachten Sie, dass das Importieren
*
in Python generell vermieden werden sollte.)Standardmäßig überschreiben die Produktionsserver nichts. Getan!
Im Vergleich zu den anderen Antworten ist diese Antwort einfacher, da keine Aktualisierung
PYTHONPATH
oder Einstellung erforderlich ist , mitDJANGO_SETTINGS_MODULE
der Sie jeweils nur an einem Django-Projekt arbeiten können.quelle
if os.environ.get('DJANGO_DEVELOPMENT', 'true')
funktioniert auch. Ich erwähne dies nur, weil die obigeis not true
Methode für mich unter Python 3.6 nicht importiert werden konnte.DEV
Einstellungen verwendet, die private Daten auf einem öffentlichen Server verlieren . Sie möchten wirklich nur überprüfen, ob dieDJANGO_DEVELOPMENT
Umgebungsvariable vorhanden ist (dhis not None
).settings_dev.py
auf den Server geladen wurde.is not None
Scheck ablege . Auchos.getenv
ist die KurzschriftNormalerweise habe ich eine Einstellungsdatei pro Umgebung und eine freigegebene Einstellungsdatei:
Jede meiner Umgebungsdateien enthält:
Auf diese Weise kann ich freigegebene Einstellungen bei Bedarf überschreiben (indem ich die Änderungen unter dieser Zeilengruppe hinzufüge).
Ich wähle dann die zu verwendenden Einstellungsdateien aus, indem ich sie mit settings.py verknüpfe:
quelle
import *
? Deaktivieren Sie diese Prüfung? Ich habe diesen Import in eine eingeschlossen,exec()
aber dann kann ich keine Bedingungen für Variablen haben, die nicht in dieser Datei definiert sind, noch kann ich eineINSTALLED_APPS
Variable ändern , weil sie "undefiniert" istSo mache ich es in 6 einfachen Schritten:
Erstellen Sie einen Ordner in Ihrem Projektverzeichnis und benennen Sie ihn
settings
.Projektstruktur:
Erstellen Sie vier Python - Dateien innerhalb des
settings
Verzeichnisses nämlich__init__.py
,base.py
,dev.py
undprod.py
Einstellungsdateien:
Öffnen Sie es
__init__.py
und füllen Sie es mit folgendem Inhalt:init .py:
Öffnen Sie es
base.py
und füllen Sie es mit allen allgemeinen Einstellungen (die sowohl in der Produktion als auch in der Entwicklung verwendet werden), zum Beispiel:base.py:
Öffnen
dev.py
und fügen Sie das entwicklungsspezifische Material hinzu, zum Beispiel:dev.py:
Öffnen
prod.py
und fügen Sie das produktionsspezifische Material hinzu, zum Beispiel:prod.py:
quelle
Erstellen Sie mehrere
settings*.py
Dateien und extrapolieren Sie die Variablen, die sich pro Umgebung ändern müssen. Dann am Ende Ihrer Master-settings.py
Datei:Sie behalten die separaten
settings_*
Dateien für jede Stufe.Fügen Sie oben in Ihrer
settings_dev.py
Datei Folgendes hinzu:So importieren Sie Variablen, die Sie ändern müssen.
Dieser Wiki-Eintrag enthält weitere Ideen zum Aufteilen Ihrer Einstellungen.
quelle
settings_prod.py
modname = "%s.settings" % ".".join(__name__.split('.')[:-1])
, um den vollständigen Modulnamen zu erhalten und dannglobals().update(vars(sys.modules[modname]))
. Ich finde, das funktioniert gut für mich. Natürlich würde es in den meisten Fällen wahrscheinlich auch funktionieren, auf das programmgesteuerte Bestimmen des Modulnamens zugunsten eines Strings zu verzichten.Ich benutze die fantastischen Django-Konfigurationen und alle Einstellungen sind in meinem gespeichert
settings.py
:Um das Django-Projekt zu konfigurieren, habe ich nur die Dokumente befolgt .
quelle
Hier ist der Ansatz, den wir verwenden:
settings
Modul zum Aufteilen von Einstellungen in mehrere Dateien zur besseren Lesbarkeit;.env.json
Datei zum Speichern von Anmeldeinformationen und Parametern, die aus unserem Git-Repository ausgeschlossen werden sollen oder die umgebungsspezifisch sind;env.py
Datei zum Lesen der.env.json
DateiBetrachtet man die folgende Struktur:
Mit
.env.json
wie:Und
project_name/env.py
:Wir können die folgenden Einstellungen haben:
Die Vorteile dieser Lösung sind:
.env.json
wie Entwicklung, Staffelung und Produktion haben.Ich hoffe, das hilft. Lassen Sie mich einfach wissen, wenn Sie bei dieser Lösung Vorbehalte feststellen.
quelle
env
mit zu ersetzen istdev
,prod
usw.? Was geht in die altesettings.py
Datei? Was ist drinstorage.py
unddatabase.py
?env.py
Datei einfach aktualisieren , so dass Sie mit einer Umgebungsvariablen auswählen können, welche Datei geladen werden sollIch benutze die folgende Dateistruktur:
So
__init__.py
ist ein Link (in Unix oder Mklink in Windows) zulocal.py
oder kann zu sein,prod.py
damit die Konfiguration noch improject.settings
Modul sauber und organisiert ist, und wenn Sie eine bestimmte Konfiguration verwenden möchten, können Sie die Umgebungsvariable verwenden,DJANGO_SETTINGS_MODULE
um,project.settings.prod
wenn Sie benötigen um einen Befehl für die Produktionsumgebung auszuführen.In den Dateien
prod.py
undlocal.py
:und die
shared.py
Datei bleibt ohne bestimmte Konfigurationen global.quelle
Aufbauend auf der Antwort von cs01:
Wenn Sie Probleme mit der Umgebungsvariablen haben, setzen Sie ihren Wert auf eine Zeichenfolge (z
DJANGO_DEVELOPMENT="true"
. B. habe ich ).Ich habe auch den Datei-Workflow von cs01 wie folgt geändert:
Auf diese Weise muss Django nicht die gesamte Einstellungsdatei durchlesen, bevor die entsprechende Einstellungsdatei ausgeführt wird. Diese Lösung ist nützlich, wenn Ihre Produktionsdatei Dinge benötigt, die sich nur auf Ihrem Produktionsserver befinden.
Hinweis: in Python 3, importierte Dateien benötigen , um ein
.
angehängt (zfrom .settings_dev import *
)quelle
Wenn Sie 1 Einstellungsdatei behalten möchten und Ihr Entwicklungsbetriebssystem sich von Ihrem Produktionsbetriebssystem unterscheidet, können Sie dies am Ende Ihrer settings.py einfügen:
Lesen Sie mehr: Wie überprüfe ich das Betriebssystem in Python?
quelle
Dies scheint beantwortet worden zu sein, aber eine Methode, die ich in Kombination mit der Versionskontrolle verwende, ist die folgende:
Richten Sie eine env.py-Datei im selben Verzeichnis wie die Einstellungen in meiner lokalen Entwicklungsumgebung ein, die ich auch zu .gitignore hinzufüge:
env.py:
.gitignore:
settings.py:
Ich finde nur, dass dies funktioniert und viel eleganter ist - mit env.py ist es einfach, unsere lokalen Umgebungsvariablen zu sehen, und wir können all dies ohne mehrere settings.py-Dateien oder ähnliches verarbeiten. Mit dieser Methode können alle Arten von lokalen Umgebungsvariablen verwendet werden, die nicht auf unserem Produktionsserver festgelegt werden sollen. Durch die Verwendung des .gitignore über die Versionskontrolle halten wir auch alles nahtlos integriert.
quelle
Config
Klasse innerhalb einerenv.py
Datei definieren. Anstelle von aimport *
kann das Modul dann von importiert werdenfrom env import Config
. Auf diese Weise müssen Sie das auch nicht verwenden, wenn Sieos.path
prüfen, was das Ganze viel einfacher macht.Verwendung
settings.py
für die Produktion. Im selben Verzeichnissettings_dev.py
für Überschreibungen erstellen .Führen Sie auf einer Entwicklungsmaschine Ihre Django-App aus mit:
Auf einer Prod-Maschine laufen, als ob Sie gerade hatten
settings.py
und sonst nichts.VORTEILE
settings.py
(für die Produktion verwendet) ist völlig unabhängig von der Tatsache, dass es sogar andere Umgebungen gibt.settings_dev.py
. Keine Notwendigkeit, Konfigurationen zu sammeln, die über und verstreutsettings_prod.py
sind .settings_dev.py
settings_shared.py
quelle
Für das Problem beim Einstellen von Dateien habe ich mich für das Kopieren entschieden
Wenn Sie django ausführen, wird __init__py ausgeführt. Zu diesem Zeitpunkt
settings.py in setting1_dir
wird ersetztsettings.py in Project
.Wie wähle ich eine andere Umgebung?
__init__.py
direkt ändern .__init__.py
.__init__.py
Sie diese Variable dann lesen.Warum auf diese Weise verwenden?
Da ich nicht so viele Dateien im selben Verzeichnis mag, verwirren zu viele Dateien andere Partner und sind für IDE nicht sehr gut. (IDE kann nicht finden, welche Datei wir verwenden.)
Wenn Sie nicht alle diese Details sehen möchten, können Sie das Projekt in zwei Teile teilen.
quelle
Ich verwende eine andere app.yaml-Datei, um die Konfiguration zwischen Umgebungen in der Google Cloud App Engine zu ändern.
Sie können dies verwenden, um eine Proxy-Verbindung in Ihrem Terminalbefehl herzustellen:
https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit
Datei: app.yaml
quelle
Dies ist meine Lösung mit unterschiedlichen Umgebungen für Entwickler, Test und Produkt
quelle