Django środowisko deweloperskie i produkcyjne

Jednym z najprostszych podejść do rozdzielenia ustawień na środowisko produkcyjne i deweloperskie jest rozdzielenie ustawień charakterystycznych dla obu środowisk na oddzielne pliki, których nazwy będa jednoznacznie wskazywały na środowisko (dev.py i production.py). Ustawienia wspólne dla wszystkich środowisk możemy zawrzeć w pliku defaults.py.

Zacznijmy jednak od początku. Najpierw w katalogu aplikacji, tj. tam gdzie znajduje się plik settings.py trzeba stworzyć katalog "settings" a tam stworzyć plik "__init__.py", gdzie jako domyślne możemy ustawić środowisko deweloperskie:

from my_app.settings.dev import *

Następnie w tym samym katalogu w pliku "defaults.py" umieszczamy wszystkie ustawienia, które są wspólne dla wykorzystywanych środowisk.

W pliku "dev.py" nawiązujemy do pliku defaults:

from my_app.settings.defaults import *

DEBUG = True

FILER_DEBUG = True

FILER_ENABLE_LOGGING = True

#oraz inne ustawienia charakterystyczne dla środowiska deweloperskiego np. ustawienia bazy danych

W pliku "production.py" również należy nawiazać do ustawień wspólnych oraz zamieścić wszelkie ustawienia charakterystyczne dla środowiska produkcyjnego:

from my_app.settings.defaults import *

DEBUG = False

# oraz inne ustawienia, w tym dane bazy danych środowiska produkcyjnego

Struktura tego katalogu przedstawia się następująco:

  • my_app/
    • settings/
      • __init__.py
      • defaults.py
      • dev.py
      • production.py

Gdy środowisko deweloperskie uczyniśliśmy domyślnym, musimy jakoś zainicjować środowisko produkcyjne na serwerze. W przypadku serwera apache zrobiłem to poprzez wpis w pliku wsgi.py na serwerze produkcyjnym:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_app.settings.production")

Warto ten plik, tj. wsgi.py, włączyć do listy git ignore, tak żeby przy każdej aktualizacji kodu nie pobierało nam pliku loklanego bez tego ustawienia.

Druga istotna rzecz to gdy ustawienia zostaną przeniesione do katalogu settings musimy zaktualizować ścieżkę np. MEDIA_ROOT tj. zamiast np. 'media' '../media', czy STATICFILES_DIRS.