Django-Einstellungen per Umgebungsvariable

Geschrieben am 05. Dezember 2014

Bei der Django-Konfiguration gibt es einige Einstellungen, die sich zwischen Produktiv- und Entwicklungsumgebung unterscheiden. Andere Einstellungen wie SECRET_KEY müssen geheim gehalten werden und sollten daher nicht mit in die Versionsverwaltung eingecheckt werden. Für diese Einstellungen verwende ich Umgebungsvariablen. Dies entspricht auch der Empfehlung von The Twelve-Factor App: strikte Trennung von Code und Konfiguration.

Setzen der Umgebungsvariablen mit virtuenvwrapper

Meine Django-Applikationen betreibe ich in einer virtualenv-Umgebung. Daneben verwende ich virtualenvwrapper. Letzteres legt eine Datei postactivate an, in der ich die Umgebungsvariablen konfigurieren kann.

Um das Ganze zu demonstrieren, erstelle ich eine neue virtuelle Umgebung.

hendrik@xps13 ~ mkvirtualenv test
New python executable in test/bin/python
Installing setuptools, pip...done.

Darin ist die Umgebungsvariable SECRET_KEY nicht gesetzt:

(test) hendrik@xps13 ~ echo $SECRET_KEY

Nun ergänze ich die Umgebungsvariable in ~/.virtualenvs/test/bin/postactivate.

(test) hendrik@xps13 ~ cat ~/.virtualenvs/test/bin/postactivate 
#!/bin/zsh
# This hook is run after this virtualenv is activated.

(test) hendrik@xps13 ~ echo "export SECRET_KEY=nicht_ganz_so_sicherer_beispiel_secret_key" >> ~/.virtualenvs/test/bin/postactivate
(test) hendrik@xps13 ~ cat ~/.virtualenvs/test/bin/postactivate
#!/bin/zsh
# This hook is run after this virtualenv is activated.

export SECRET_KEY=nicht_ganz_so_sicherer_beispiel_secret_key

Wenn ich die Umgebung nun neu starte, ist die Umgebungsvariable gesetzt:

(test) hendrik@xps13 ~ deactivate 
hendrik@xps13 ~ workon test
(test) hendrik@xps13 ~ echo $SECRET_KEY
nicht_ganz_so_sicherer_beispiel_secret_key

Dieses Verfahren verwende ich sowohl in der Entwicklungs- als auch in der Produktivumgebung.

Verwendung in den Django-Einstellungen

In den Django-Einstellungen kann man nun einfach das Python-Modul os verwenden, um den Wert der Umgebungsvariablen zu lesen.

import os
SECRET_KEY = os.environ["SECRET_KEY"]