Alternatives
Propos
Ce chapitre est consacré à la présentation d’alternatives aux choix retenus pour mener la construction du projet exposé tout au long de cet ouvrage. Ils ne sont pas moins valables, mais soit il fallait bien arrêter un choix pour ne pas se disperser, soit il était plus confortable dans un premier temps d’éviter des solutions plus élaborées.
Alternance entre plusieurs versions de Django
Django vise un rythme de publication d’une nouvelle version environ tous les huit mois pour apporter des fonctionnalités. On peut toujours se dire que son projet n’en a pas besoin et décider de conserver sa version actuelle puisqu’elle donne satisfaction. Mais cette cadence élevée de publication a comme conséquence l’obsolescence tout aussi rapide des anciennes versions, ce qui signifie un terme à la maintenance corrective des dysfonctionnements et plus sensiblement des failles de sécurité.
Si on ne fait rien de particulier, une installation ordinaire d’une nouvelle version de Django va remplacer la version actuelle. Cette bascule sans retour peut convenir dans des situations simples et sans enjeu, un environnement de démonstration par exemple.
Dans la plupart des cas, il est nécessaire de prévoir une phase de transition, où les projets sont évalués au sein de la nouvelle version de l’infrastructure logicielle et éventuellement ajustés, notamment face aux pratiques dépréciées qui font apparaître des messages d’avertissement, voire d’erreur si on n’a pas anticipé les changements annoncés. Dans tous les cas, il est courant que le développement du projet suive son cours et que, pour des raisons d’engagements de maintenance corrective, il faille s’assurer du bon fonctionnement du projet sur la version précédente, ou même sur un certain nombre de versions anciennes.
C’est encore plus vrai pour un développeur de paquets redistribuables publics, qui par nature ne maîtrise aucunement la progression des montées de version des plateformes utilisatrices de ses paquets.
L’objectif va être d’avoir un moyen efficace pour alterner la version de Django. Ce n’est évidemment pas la méthode brutale de réinstallation de l’une sur l’autre, même si l’opération n’est pas longue.
1. Par configuration propre au site
Mise en garde :
Cette méthode est un contournement et n’est pas officiellement supportée par l’infrastructure logicielle, mais elle a l’avantage d’être simple et ne nécessite l’emploi d’aucun outil...
Variations de configurations
Le chapitre Création de site a donné plusieurs techniques élémentaires pour ajuster des paramètres de configuration en fonction de l’environnement d’exécution : développement, tests, production, etc. Le revers de leur simplicité était la possible introduction de redondances dans les définitions. Cette section va exposer deux autres techniques, plus complètes, pour perfectionner ce point.
1. Superposition en profondeur
Le point de départ est la dernière base de code donnée dans la sous-section « Les techniques par superposition » du chapitre Création de sites, rappelée ci-dessous.
settings.py
# Configuration par défaut (production)
# ...
try:
from mysite import settings_local
except ImportError:
print("""
-----------------------------------------------------
Vous devez créer un fichier settings_local.py
et y mettre vos paramètres de configuration locale.
-----------------------------------------------------
""")
import sys
sys.exit(1)
else:
import re
for attr in dir(settings_local):
if not attr[0].isupper(): continue
value = getattr(settings_local, attr)
match = re.search('^EXTRA_(\w+)', attr)
if match:
globals()[match.group(1)] += value
else:
globals()[attr] = value
Dans la configuration par défaut, supposons cette définition ordinaire :
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(_SITE_ROOT, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
...