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.