- La version Django 6.0, qui fête son 20e anniversaire, est une sortie majeure qui améliore massivement des domaines clés comme les templates, les tâches en arrière-plan, la sécurité et les emails.
- La fonction Template partials facilite la réutilisation du code au sein des templates, et l'intégration avec des outils comme htmx a été renforcée.
- Le framework Tasks a été ajouté pour exécuter des travaux en arrière-plan en dehors du cycle de requête-réponse HTTP.
- La Content Security Policy (CSP) est intégrée par défaut, ce qui simplifie la protection contre les attaques par injection de contenu comme le XSS.
- La modernisation de l'API email, les améliorations de l'ORM et l'extension des clés primaires améliorent grandement l'expérience développeur et la scalabilité.
Vue d'ensemble de Django 6.0
- Django 6.0 est la nouvelle version du framework web Python, qui poursuit 20 ans d'évolution.
- Les changements principaux sont centrés sur quatre blocs clés : templates, tâches en arrière-plan, sécurité et traitement des emails.
- Plusieurs contributeurs de la communauté ont participé, et les améliorations majeures sont récapitulées d'après les notes de release officielles.
Outil django-upgrade
- Lors d'une montée de version d'un projet existant de Django 5.2 ou inférieur, l'outil django-upgrade permet une conversion automatique du code.
- Il inclut 5 fixers automatiques liés à Django 6.0 et résout automatiquement certains avertissements.
Template partials
- La fonctionnalité définition de partie de template (
{% partialdef %}) a été ajoutée pour réduire la duplication de code dans les templates et permettre la réutilisation.
- Un partial défini dans le même template peut être appelé plusieurs fois.
- L'option
inline permet de le rendre en même temps qu'au moment de sa définition.
- La fonction de rendu partiel permet de rendre indépendamment un seul
partial.
- Dans l'exemple, htmx est utilisé pour actualiser périodiquement la partie
view_count.
- En ajoutant
#partial_name à l'URL, seul un fragment précis peut être rendu.
- Cette fonctionnalité a été intégrée à Django via un projet Google Summer of Code et provient du package existant
django-template-partials.
Framework Tasks
- Django a ajouté un framework Tasks pour l'exécution de tâches en arrière-plan.
- Possibilité d'exécuter du code en dehors du cycle de requête-réponse HTTP.
- Utilisable pour des tâches asynchrones comme l'envoi d'emails, le traitement de données ou la génération de rapports.
- Définir une tâche avec le décoreur
@task, l'enregistrer dans une file avec Task.enqueue().
- Les backends fournis par défaut sont
ImmediateBackend et DummyBackend à destination du développement,
et l'utilisation de DatabaseBackend du package django-tasks permet une exécution basée sur une base SQL.
- Exécuter un worker avec la commande
db_worker, et vérifier l'état via les logs.
- Cette fonctionnalité provient d'une idée lancée dans Wagtail et a été intégrée à Django après la proposition DEP 0014.
Support de Content Security Policy (CSP)
- Django 6.0 prend en charge nativement la norme CSP pour renforcer la défense contre des attaques d'injection de contenu comme le XSS.
- Ajouter
ContentSecurityPolicyMiddleware à MIDDLEWARE pour l'activer.
- Les paramètres
SECURE_CSP et SECURE_CSP_REPORT_ONLY permettent de configurer la politique.
- Une sécurité basée sur le nonce est intégrée, ce qui permet d'ajouter l'attribut
nonce="{{ csp_nonce }}" aux balises <script> et <style>.
- Un nonce aléatoire est généré à chaque requête et seules les ressources de confiance sont exécutées.
- Le CSP, proposé en 2004, était implémenté via le package
django-csp et devient officiellement intégré dans cette version.
Mise à jour de l'API email
- La logique d'email de Django est passée à l'API email moderne de Python 3.6.
- Elle utilise en interne la classe
email.message.EmailMessage.
- Les interfaces existantes
send_mail() et EmailMessage restent inchangées.
- La nouvelle API offre notamment une réduction des bugs, une meilleure sécurité et une amélioration du traitement des pièces jointes inline.
- Avec l'objet
MIMEPart, il est simple d'ajouter des pièces jointes inline comme des images dans le corps HTML.
- Cette modification a été proposée en 2024 et fusionnée après 8 mois de développement.
Restriction des arguments positionnels de l'API email
- Dans l'API
django.core.mail, certains paramètres sont désormais acceptés uniquement en arguments nommés.
- Si des paramètres optionnels comme
fail_silently sont passés positionnellement, un avertissement est affiché.
- C'est une mesure destinée à améliorer la lisibilité et la maintenabilité.
- Correction automatique possible via le fixer
mail_api_kwargs de django-upgrade.
Extension de l'import automatique dans le shell
- La fonctionnalité d'import automatique des modèles de Django 5.2 est étendue,
avec import automatique de
settings, connection, models, functions, timezone.
- La liste des imports automatiques est visible avec
./manage.py shell -v 2.
- Cela améliore la commodité de développement et réduit le code répétitif.
Amélioration de l'ORM : mise à jour dynamique des champs lors de save()
- Les champs
GeneratedField ou basés sur des expressions sont mis à jour automatiquement après save().
- Sur les DB supportant la clause
RETURNING (SQLite, PostgreSQL, Oracle), la mise à jour est immédiate.
- Sur MySQL et MariaDB, elle est effectuée en chargement différé.
- Il est possible d'utiliser immédiatement la valeur la plus récente sans requête supplémentaire, ce qui améliore l'efficacité.
Fonction d'agrégation StringAgg universelle
- La fonction d'agrégation
StringAgg est disponible sur tous les backends de bases de données.
- Elle renvoie une chaîne obtenue en concaténant les valeurs avec un séparateur (delimiter).
- Fonctionalité qui était auparavant spécifique à PostgreSQL, elle est désormais accessible directement depuis
django.db.models.
- Le séparateur peut être spécifié via l'expression
Value().
BigAutoField par défaut
- La valeur par défaut de
DEFAULT_AUTO_FIELD a été changée en BigAutoField.
- Utilisation d'une clé primaire d'entiers 64 bits pour prévenir la exhaustion des clés primaires.
- Sur les nouveaux projets, l'application est automatique sans configuration supplémentaire.
- La configuration introduite par Django 3.2 est simplifiée, ce qui réduit la surcharge de configuration.
Améliorations du template
- La variable
forloop.length a été ajoutée pour accéder à la longueur totale d'une boucle.
- Utilisation sous la forme
{{ forloop.counter }}/{{ forloop.length }}.
- Le tag template
querystring est amélioré.
- Ajout automatique de
? quand le mapping est vide, pour garantir une cohérence de comportement des liens.
- Support de la fusion de plusieurs arguments de mapping pour faciliter la combinaison des paramètres de requête.
Conclusion
- Django 6.0 a rassemblé 174 contributeurs,
avec de nombreuses optimisations et corrections de bugs incluses.
- La montée de version améliore globalement la sécurité, la maintenabilité et l'expérience développeur (DX).
- Consultez les notes de release officielles pour les changements supplémentaires.
Aucun commentaire pour le moment.