En Django, le fichier settings.py, c’est juste du Python
lundi 24 septembre 2012 à 14:42On a beau répêter dans la doc, “Django is just Python”, c’est difficile de s’y faire. Surtout dans le fichier settigns.py: c’est vrai que le paramétrage, c’est quelque chose qu’on a l’habitude d’être typiquement déclaratif.
Rappel donc, le fichier settings.py, c’est juste du Python.
Ça veut dire qu’on peut faire ça en début de fichier:
import os # répérer le dossier du projet ROOT_DIR = os.path.dirname(os.path.realpath(__file__)) Et ça un peut partout dans le projet pour éviter les d'avoir des chemins absolus en dur: STATIC_ROOT = os.path.join(ROOT_DIR, 'static')
On peut aussi faire des choses comme celle-ci, pour avoir un comportement spécial en mode debug:
if DEBUG: # on retire le dernier middleware MIDDLEWARE_CLASSES = [:-1] #et on en rajoute un au début MIDDLEWARE_CLASSES = ( 'libs.middlewares.MonMiddlewareKilebo', ) + MIDDLEWARE_CLASSES
Et si un settings n’existe pas, on peut l’inventer pour le réutiliser partout dans son code ailleurs:
SERVER_POOL = ( ('8.8.8.8', "sametmax.com"), ('8.8.4.4', "cnd.sametmax.com"), ('208.67.222.222', 'staging.sametmax.com'), ('208.67.220.220', "dev.sametmax.com") )
Et même se faciliter la vie:
SERVER_POOL_DICT = dict(SERVER_POOL)
Dans le même genre on peut faire des calculs:
CINQ_MINUTES = 60 * 5 ... CACHE_MIDDLEWARE_SECONDS = CINQ_MINUTES * 2
Et bien entendu, on peut splitter son fichier de settings en plusieurs fichiers. Il y a le maintenant classique fichier de settings local qui est différent sur chaque marchine, et qu’on importe en fin de fichier:
try: from settings_local import * except ImportError: pass
Ca permet de mettre les paramètres de la base de données dans settings_local.py.
Mais on oublie souvent que peut tout à fait récupérer les paramètres depuis un fichier non Python.
Récupérer des valeurs dans un fichiers ini ? Fastoche !
import ConfigParser config = ConfigParser.RawConfigParser() config.readfp('/chemin/vers/fichier.ini') locals().update(config.items('section'))