- Fonctionnalités
- Pricing

Cet article de blog est basé sur une présentation de produit par Antonis Kalipetis, ingénieur chez SymfonyCon 2023, sur l'expérience d'Upsun avec Nix. Nous avons utilisé ChatGPT pour la transcription et pour améliorer la grammaire et la syntaxe.
Les déploiements Django ont évolué depuis les débuts du framework. Alors que les migrations Django ont été introduites dans la version 1.6 pour nous simplifier la vie, les modèles de déploiement modernes, tels que les mises à jour progressives et la mise à l'échelle horizontale, ont introduit de nouvelles complexités que les développeurs doivent comprendre et anticiper. Lors d'un atelier en direct, Antonis a présenté ce qui ne fonctionne pas lors des déploiements et comment l'éviter.
Chaque déploiement d'application Django se compose de plusieurs éléments clés qui fonctionnent ensemble. À l'avant, vous avez un serveur proxy, généralement Nginx, Apache ou des options plus récentes comme Caddy et Traefik. Ce proxy gère la terminaison TLS, le routage de domaine et les redirections. Derrière lui se trouve votre serveur d'applications, généralement Gunicorn ou Uvicorn pour les applications asynchrones. Ceux-ci sont pris en charge par une couche de cache (telle que Redis ou Memcached) et une base de données (PostgreSQL, MySQL ou, de plus en plus, SQLite, pour certains cas d'utilisation).
Cette architecture fonctionne bien pour les déploiements sur un seul serveur, mais les applications modernes s'exécutent souvent sur plusieurs serveurs avec des mises à jour continues, ce qui crée des scénarios où différentes versions de votre application s'exécutent simultanément.
Lorsque vous développez des applications Django localement, manage.py runserver gère automatiquement le service des fichiers statiques. En production, cependant, cette approche devient problématique. Les serveurs d'applications Python sont conçus pour traiter une seule requête à la fois (à quelques exceptions près pour ASGI), ce qui les rend inadaptés au service de contenu statique, tel que CSS, JavaScript et images.
Le véritable défi survient lorsque plusieurs serveurs d'applications exécutent différentes versions de votre code. Prenons l'exemple suivant : vous mettez à jour votre CSS avec une nouvelle couleur de marque et vous le déployez à l'aide de l'ManifestStaticFilesStorage de Django. Ce backend de stockage crée des noms de fichiers hachés, tels que app.a1b2c3d4.css, afin de permettre une mise en cache permanente.
Au cours d'un déploiement progressif, vous pouvez avoir :
app.old123.cssapp.new456.cssSi la demande d'un utilisateur pour le nouveau fichier CSS est acheminée vers l'ancien serveur, il recevra une erreur 404, ce qui perturbera la mise en page.
Stockage externe : téléchargez les fichiers statiques vers des services tels qu'Amazon S3 ou un stockage cloud similaire. Cela garantit que toutes les versions de votre application peuvent accéder aux mêmes fichiers statiques.
Mise en cache au niveau du proxy : configurez votre serveur proxy (Nginx, etc.) pour mettre en cache les fichiers statiques pendant une durée raisonnable. Cela crée un tampon pendant les déploiements, où les anciens fichiers restent disponibles pendant que les nouveaux se propagent.
Systèmes de fichiers partagés : montez le répertoire statique sur tous les serveurs afin que les anciennes et les nouvelles versions de l'application puissent servir les fichiers à partir du même emplacement.
Middleware WhiteNoise : cette bibliothèque Python sert les fichiers statiques directement à partir de votre application Django avec des en-têtes de mise en cache efficaces, bien qu'elle utilise les ressources du serveur d'applications.
Les migrations Django sont puissantes, mais elles nécessitent une planification minutieuse dans les environnements multi-versions. Le présentateur l'a démontré à l'aide d'un exemple pratique utilisant une application de signalement d'observations de Bigfoot.
L'ajout d'un nouveau champ à un modèle semble simple, mais considérez ce qui se passe lorsque vous ajoutez un champ obligatoire avec une valeur par défaut :
# New field added
gdpr_accepted = models.BooleanField(default=False)Après avoir exécuté les migrations, la nouvelle version de l'application reconnaît ce champ, mais pas l'ancienne version. Lorsque l'ancienne version tente d'enregistrer un enregistrement, elle échoue car la base de données attend le champ d'gdpr_accepted , mais l'ancien code ne le fournit pas.
Le présentateur a mis en avant le nouveau paramètre db_default de Django 5 comme solution :
gdpr_accepted = models.BooleanField(db_default=False)Avec db_default , c'est la base de données elle-même qui gère la valeur par défaut, et non le code Python. Cela signifie que les anciennes versions de l'application peuvent enregistrer des enregistrements avec succès, même sans connaître le nouveau champ.
Les mises à jour progressives créent un état temporaire dans lequel plusieurs versions de votre application s'exécutent simultanément. Cela nécessite une coordination minutieuse entre :
Si Django semble simplifier la restauration des migrations grâce à manage.py migrate app_name 0001 , les restaurations en production sont rarement aussi simples. Le présentateur a souligné, d'après son expérience, que les restaurations rencontrent souvent des problèmes inattendus, ce qui rend la prévention par une planification minutieuse plus précieuse que le recours aux capacités de restauration.
Les fournisseurs modernes de plateformes en tant que service, tels que Upsun, répondent à bon nombre de ces défis grâce à :
Cependant, il reste essentiel de comprendre les défis sous-jacents, même lorsque l'on utilise des plateformes gérées.
Les outils intégrés de Django, tels que les migrations et la gestion des fichiers statiques, sont puissants, mais ils nécessitent une application réfléchie dans les environnements de production. La complexité augmente considérablement lorsque vous passez de déploiements sur un seul serveur à des applications à échelle horizontale et déployées en continu.
Pour réussir, il faut :
À mesure que les applications Django se développent et que les modèles de déploiement deviennent plus sophistiqués, les développeurs doivent élargir leur compréhension au-delà des modèles de développement locaux. Le framework fournit les outils, mais pour réussir les déploiements en production, il faut orchestrer soigneusement ces outils dans le contexte spécifique de votre infrastructure.
Si Django continue de faciliter notre travail de développement, le déploiement en production reste un domaine où une planification minutieuse et une bonne compréhension des systèmes sous-jacents sont payantes en termes de fiabilité des applications et d'expérience utilisateur.
Join our monthly newsletter
Compliant and validated