PythonAutoReload, ou comment perdre des mois pour une seule ligne de paramétrage
Ven 23 mars 2007
Il y a plus d'un an, je râlais contre Django et son comportement erratique. En gros, en utilisant le serveur Apache au mieux de sa forme, j'arrivais à un non-sens total : le code résultat n'avait rien à voir avec mes modifications, une fois sur deux. Genre "mécanique quantique pour les geeks".
Depuis quelques jours, je me suis réattelé à la bête, et j'ai fini par
tenter le coup du côté du canal de discussion IRC #django, sur
freenode.
J'ai posé ma question, et j'ai reçu au moins deux réponses très
satisfaisantes :
Redémarrer Apache
Si l'application Django se lançait correctement, en revanche, Python ne
prenait pas en compte les modifications apportées.
Imaginons que mon application réside sur http://localhost/
Imaginons que j'aie une vue Django qui renvoie "salut", en texte, tout
simple. Et ça marche bien.
Je modifie ma vue pour qu'elle affiche "meuh".
Je recharge dans mon navigateur... Paf ! j'ai toujours "salut".
Je redémarre Apache, je recharge ma page... Bing ! j'ai "meuh" qui
s'affiche.
Evidemment, quand on est en train de faire des tests, la pire des choses est de devoir redémarrer son serveur à chaque fois qu'on fait "Ctrl-S" dans son code.
La solution n'est satisfaisante qu'à 33%.
Paramétrer correctement ses Virtual Hosts
Vient alors un paramètre, qui n'apparaît qu'en tout petit dans la doc :
PythonAutoReload
.
Quand on met ce paramètre à "On"
, Python "sait" qu'au moment de
recharger la vue, il doit recompiler le modèle, et tout le reste.
Du coup, quand on recharge la page, la vue est actualisée elle aussi, et
elle renvoie "meuh" quand on a écrit "meuh".
Par contre, ce paramètre est à "Off" par défaut pour une bonne raison :
devoir recompiler le byte-code à chaque refraîchissement de la page,
c'est un peu lourdingue pour le serveur. On risque une surchauffe...
Dans le cas d'un serveur de test / développement, c'est pas
fondamentalement grave, mais on ne peut certainement pas imaginer
conserver ce paramètre sur un serveur en exploitation.
La solution n'est satisfaisante qu'à 66%.
Et le serveur de test ?
Le serveur de test est léger, rapide, ne nécessite pas de paramétrage de
virtualhost à la mord-moi-le-noeud et surtout.... il effectue un
auto-reload AUTOMATIQUEMENT !
Oui oui oui ! Il scrute les fichiers, et dès qu'il y en a un de modifié,
il se recharge tout seul et quand on rafraîchit la page, on a
"MEUH".
Pour le lancer, il suffit de se trouver dans la racine de l'application
et de faire :
python manage.py runserver
Attention toutefois, ce serveur n'est pas fait pour autre chose que les tests, et ne peut pas servir à mettre une application en exploitation.
En plus, un Djangoïste du canal IRC m'a affirmé que le comportement du
serveur de test était identique aux serveurs "classiques" à 99.9%.
Franchement, je sais pas comment il a pu compiler ce chiffre, mais je
l'en remercie.
Pour mes tests, inutile de mettre un Apache en branle avec sa cohorte de
paramètres compliqués : je peux parfaitement effectuer mes
développements en local, aidé d'un serveur réactif et compréhensif.
J'suis content à 99%... maintenant, je vais pouvoir Djangoïser !
Par contre, c'est toujours la dêche pour trouver des hébergeurs "pro" sympa et pas cher, apparemment.
PS : Y'a aussi un chan #django-fr (toujours sur Freenode) plein de gens très sympas aussi.