Eltérő környezetek beállításainak kezelése Djangoval

Django alapú alkalmazásfejlesztésnél a settings modul hordozza a projektre jellemző konfigurációkat. Gyári kiszerelés esetén (django-admin.py startproject) ez tipikusan a settings.py fájl. Legyen bármilyen kis feladatról szó, célszerű az alkalmazás fejlesztői és éles környezetét szétválasztani. A két környezet adottságai nem szükségszerűen azonosak: eltérő adatbázis- és webkiszolgáló, más elérési útvonalak (path) sít. Hogyan lehet mégis a különböző szoftverkörnyezetek konfigurációját a settings modulban elkönyvelni?

Több megoldás is elképzelhető. Közkedvelt módszer az eltérő konfigurációkat a settings modulból egy új local_settings modulba átemelni, majd a settings modul végén a local_settings-et betölteni.

# settings.py

# ...

try:
    from local_settings import *
except ImportError:
    pass

A local_settings-et a verziókövető rendszerbe nem regisztráljuk, így deploy során nem írja felül a helyi változat a távoli modult.

A korlátja ennek a megközelítésnek, hogy nem áll módunkban verziókezelten hozzáférni a local_settings tartalmához, nem tudjuk azt az alkalmazással együtt menedzselni. Éles környezetben pedig kifejezetten veszélyes egy árva állomány direkt szerkesztése.

Egy rugalmasabb megoldás érdekében a local_settings alapötletét továbbgondolhatjuk. A settings.py állományt mozgassuk át a settings/__init__.py alá. (Pythonban mindkettő egyenértékű a settings modullal.) A settings/ mappában az eleddig környezetenként különálló local_settings.py fájlokat másoljuk be a környezetre utaló fájlnévvel: development.py, staging.py, production.py stb. Ezeket az állományokat is regisztráljuk a verziókövető rendszerbe. A local_settings.py fájlokba pedig környezetenként hívjuk meg a megfelelő modult, például fejlesztői gépen:

# local_settings.py

from settings.development import *

A settings modul tehát továbbra is a környezetek megegyező konfigurációját tartalmazza, míg az eltérő beállításokat külön Python modulokba tároltuk le. Minden verziókezelt, így a megszokott deploy folyamat része lesz ezen fájlok publikálása. Hogy adott környezetben melyik modul kerüljön betöltésre, azt a környezet egyszeri létrehozásakor tudjuk a local_settings.py-ban feljegyezni – és többet ehhez a fájlhoz nem is kell hozzányúlni.

17aug.

3 Comment for Eltérő környezetek beállításainak kezelése Djangoval

  1. RePa says:

    Pont nemreg kerdezte proclub/janoszen kollega, hogy en hogy szoktam csinalni, es en is kb. igy szoktam, de o kornyezeti valtozokkal szerette volna megoldani a dolgot, akkor pont nem jutott eszembe az egyertelmu, megpedig a DJANGO_SETTINGS_MODULE nevu kornyezeti valtozo, amit ha beallitunk, akkor a neki megadott modult hasznalja majd a settings.py helyett.

    • ebielaV7 says:
      WSGI esetén a DJANGO_SETTINGS_MODULE kifejezetten jó választás lehet, hiszen azt amúgy is be kell állítani a .wsgi fájlban.
    • ebielaV7 says:

      Annyi kiegészítést még tennék, a Django könyv Chapter 12: Deploying Django c. fejezetében is az általad javasolt módszert ajánlják -- tehát a DJANGO_SETTINGS_MODULE-on keresztül célszerű a settings modult megadni.

Szólj hozzá