Sortie de Django 6
(docs.djangoproject.com)- La version 6.0 du framework web Django a été publiée, avec prise en charge de Python 3.12+, et un renforcement massif de la sécurité, des templates et des capacités asynchrones
- La Content Security Policy (CSP) est désormais intégrée, ce qui permet de configurer des politiques pour protéger contre les attaques par injection de contenu, dont le XSS
- La fonctionnalité Template Partials permet de définir des parties réutilisables dans les templates, améliorant la modularité du code
- Un framework Background Tasks a été ajouté pour prendre en charge l’exécution de tâches asynchrones en dehors du cycle requête-réponse
- L’adoption d’une API email Python plus récente, la fin du support de MariaDB 10.5 et le changement de la valeur par défaut
DEFAULT_AUTO_FIELDpermettent d’effectuer des ajustements de compatibilité et de modernisation
Compatibilité Python
- Django 6.0 prend en charge Python 3.12, 3.13 et 3.14, avec un support officiel limité aux dernières versions de chaque série
- Django 5.2.x est la dernière version à prendre en charge Python 3.10 et 3.11
- À partir de Django 6.0, il est recommandé aux applications tierces d’arrêter le support des versions antérieures à Django 5.2
Principales nouveautés
Prise en charge de Content Security Policy (CSP)
- La norme CSP est intégrée à Django pour renforcer la protection contre les attaques par injection de contenu comme le XSS
- Il est possible de définir des politiques via
ContentSecurityPolicyMiddleware, le context processorcsp()et le paramètreSECURE_CSP - Les paramètres basés sur des dictionnaires Python permettent une définition claire et sûre des politiques
- Il est possible de définir des politiques via
- Le mode de surveillance peut être défini via
SECURE_CSP_REPORT_ONLY - Des décorateurs sont proposés pour redéfinir ou désactiver la politique par vue
Template Partials
- Ajout des balises
partialdefetpartialpour définir et réutiliser des fragments de template - Le motif
template_name#partial_namepermet de les référencer directement dansget_template(),render()et{% include %} - Un guide de migration est fourni pour les utilisateurs du package tiers
django-template-partials
Framework de tâches d’arrière-plan
- Ajout d’un framework intégré à Django pour l’exécution de tâches asynchrones
- L’envoi d’e-mails, le traitement de données, etc. peut être effectué en dehors du cycle requête-réponse HTTP
- Les tâches sont définies avec le décorateur
@tasket enregistrées dans la file viaenqueue()
- Le backend est spécifié avec
TASKS, avec deux backends intégrés par défaut pour le développement et les tests - Django ne gère que la création et la mise en file des tâches ; l’exécution doit être réalisée par des processus worker externes
Adoption d’une API email Python plus récente
- La logique de traitement des e-mails de Django a été migrée vers la moderne API email de Python (à partir de Python 3.6),
email.message.EmailMessage - Les anciennes classes
SafeMIMETextetSafeMIMEMultipartne sont plus utilisées - Le type de retour de
EmailMessage.message()est désormais une instanceEmailMessagede Python
Améliorations détaillées
Admin
- Application du jeu d’icônes Font Awesome Free 6.7.2
- Possibilité de personnaliser le formulaire de changement de mot de passe de l’admin via l’attribut
AdminSite.password_change_form - Des icônes et des styles CSS distincts ont été appliqués à
messages.DEBUGetmessages.INFO
Auth
- Le nombre d’itérations de hachage PBKDF2 passe de 1 000 000 à 1 200 000
GIS
- L’attribut
GEOSGeometry.hasmpermet de vérifier la présence de la dimension M - La fonction
Rotateprend en charge la rotation à l’angle indiqué - Le fournisseur de tuiles de carte peut être personnalisé via l’attribut
BaseGeometryWidget.base_layer - À partir de MariaDB 12.0.1, prise en charge de
coveredby,isvalid,GeoHash,IsValid, etc. - Le JavaScript inline est supprimé lors du rendu des widgets, une modification de template est nécessaire en cas de personnalisation
PostgreSQL
- Les expressions Lexeme sont ajoutées pour renforcer le contrôle de la recherche en texte intégral
- Ajout du paramètre
hintsaux opérations relatives aux extensions, dontCreateExtension - Ajout de contrôles système pour les champs, index et contraintes liés à
django.contrib.postgres
Staticfiles
ManifestStaticFilesStoragegarantit une cohérence dans le tri des chemins, réduisant les diffs inutiles- La commande
collectstaticaffiche par défaut uniquement un résumé, les détails s’affichent à partir de--verbosity 2
Divers
- Ajout de la prise en charge du créole haïtien
- Les commandes
startprojectetstartappcréent automatiquement les répertoires inexistants - La commande
shellimporte automatiquement des utilitaires par défaut tels quedjango.conf.settings - Prise en charge de la sérialisation de
zoneinfo.ZoneInfodans les migrations - Ajout de nouvelles fonctions d’agrégation telles que
StringAgg,AnyValue - Prise en charge de la pagination asynchrone via
AsyncPaginatoretAsyncPage - Prise en charge de multiples en-têtes
CookieHTTP/2 en environnement ASGI - Ajout de la variable
forloop.lengthdans les templates, amélioration de la balisequerystring DiscoverRunnerprend en charge les tests parallèles en modeforkserver
Modifications non rétrocompatibles
API du backend de base de données
BaseDatabaseSchemaEditoret le backend PostgreSQL arrêtent d’utiliserCASCADElors de la suppression de colonnes- Changement de noms de méthodes, dont
return_insert_columns()→returning_columns() - Lorsque la prise en charge de
UPDATE … RETURNINGest activée, il est possible de configurerDatabaseFeatures.can_return_rows_from_update=True
Suppressions de prise en charge
- Fin du support de MariaDB 10.5 (requiert 10.6+)
- Fin du support des versions de Python inférieures à 3.12
- Versions minimales requises pour les principales bibliothèques :
aiosmtpd 1.4.5,bcrypt 4.1.1,Pillow 10.1.0,psycopg 3.1.12, etc.
- Versions minimales requises pour les principales bibliothèques :
- Suppression des attributs
mixed_subtype,alternative_subtype,encoding - En raison d’un changement d’implémentation interne, vérification des sous-classes personnalisées d’
EmailMessagenécessaire
Changement de la valeur par défaut de DEFAULT_AUTO_FIELD
- La valeur par défaut passe de
AutoFieldàBigAutoField - Les projets n’ayant pas géré l’avertissement
models.W042depuis Django 3.2 doivent ajouter la configuration
Expressions ORM
- Les paramètres retournés par la méthode
as_sql()doivent être de type tuple
Divers
- Ajout systématique d’un saut de ligne lors de la sérialisation JSON
- Version minimale d’
asgirefportée à 3.9.1
Fonctionnalités obsolètes prévues
API django.core.mail
- Pour
get_connection(),send_mail(), etc., les arguments optionnels doivent être transmis uniquement via des arguments nommés - Lors de la création d’
EmailMessageet d’EmailMultiAlternatives, seuls des arguments nommés sont autorisés après les 4 premiers paramètres
Divers
- Dépréciation de
BaseDatabaseCreation.create_test_db(serialize)remplacé parserialize_db_to_string() - Dépréciation des classes PostgreSQL
StringAgg,OrderableAggMixin - Le protocole par défaut de
urlizeeturlizetruncpassera à HTTPS dans Django 7.0 - Les paramètres
ADMINSetMANAGERSdoivent être fournis sous forme de listes de chaînes d’e-mail au lieu de tuples (nom, adresse) - Dépréciation des classes liées aux e-mails, notamment
SafeMIMEText,SafeMIMEMultipart,BadHeaderError
Fonctionnalités supprimées
- Suppression du support des arguments positionnels de
BaseConstraint - Suppression de
DjangoDivFormRendereretJinja2DivFormRenderer - Suppression du support du pilote de base de données
cx_Oracle - Le schéma par défaut de
forms.URLFieldpasse de"http"à"https" - Suppression du support des arguments positionnels de
Model.save()etModel.asave() - Suppression de
ModelAdmin.log_deletion()etLogEntryManager.log_action() - Suppression du module
django.utils.itercompat - Suppression des méthodes
GeoIP2.coords()etGeoIP2.open() - Suppression de
ForeignObject.get_joining_columns()et des méthodes associées
Django 6.0 renforce la robustesse et la scalabilité du framework grâce à la sécurité, au traitement asynchrone et à l’adoption d’une API email moderne, et clarifie la transition vers un environnement Python 3.12+.
1 commentaires
Avis Hacker News
Dans une organisation où j’ai travaillé auparavant, il y avait une codebase « moderne » en NodeJS+React, ainsi qu’une application legacy Django basée sur Python 2.7 vieille de près de 15 ans
Au début, je craignais que l’ancien code soit pénible à gérer, mais c’était en fait tout l’inverse
L’application Django était agréable à manipuler et le travail de remise en ordre était vraiment amusant. Je pense que ça me manquera le jour où elle sera remplacée par une réécriture en Go/React
Félicitations à l’équipe Django
Je maintiens depuis longtemps une application starter Django + Celery + Postgres + Redis + esbuild + Tailwind basée sur Docker Compose, et je l’ai récemment mise à jour pour Django 6.0
À voir dans le dépôt GitHub
Je n’ai pas encore activé la configuration CSP par défaut, mais je prévois de l’ajouter après l’avoir examinée plus en détail
La philosophie « batteries included » de Django est parfaitement adaptée à la génération de code par IA
Le panneau d’administration, la connexion, la réinitialisation du mot de passe et d’autres fonctions de base sont déjà bien en place, ce qui permet à l’IA de créer un site complet avec une petite codebase
Comme le code est compact et clair, il est aussi facile pour l’IA de l’améliorer de manière itérative
Au lieu d’énormes composants, on a des modèles et des templates bien définis, ce qui facilite aussi la revue du code généré par l’IA
De plus, l’admin Django existe comme ground truth indépendante, donc même si le frontend casse, on peut toujours manipuler les données
Cela dit, je trouve dommage que l’écosystème Python n’ait pas adopté le modèle gevent. La transition vers l’asynchrone aurait alors été bien plus fluide
C’est bien plus intégré que des frameworks faiblement couplés comme Flask ou FastAPI
Ce genre de différence finit par réduire énormément de petites irritations (papercuts)
J’ai réécrit une ancienne application .NET : Rails l’a presque parfaitement convertie, alors que Django avait du mal
La fonctionnalité template partials de cette release a l’air plutôt intéressante
Mais l’état des annotations de type (type annotations) reste toujours frustrant
django-stubs nécessite un plugin mypy, django-types est un fork pour pyright mais la synchronisation ne suit pas bien
pylance utilise encore son propre fork
J’espère que la prochaine version inclura au moins officiellement des types de base comme HttpRequest, HttpResponse, View et Model
Grâce à Django, le développement web a été vraiment plaisant
Même en passant à d’autres frameworks, je finis toujours par revenir à Django. Je ne l’ai jamais regretté
Même en essayant d’autres frameworks, je reviens toujours à Rails pour sa commodité
Cela dit, c’est dommage que Rails n’ait pas d’Admin UI par défaut
Si vous voulez une vraie expérience full stack, mieux vaut regarder du côté de Laravel ou Rails
Je fais du web depuis l’époque de PHP, et Django m’a toujours laissé une impression plutôt moyenne
Django a été mon premier gros projet freelance, et j’y suis toujours aussi à l’aise
J’ai tenté plusieurs expérimentations un peu audacieuses, et ça a toujours bien fonctionné. Merci Django
J’utilise Django presque exclusivement depuis près de 15 ans
J’ai essayé beaucoup d’autres frameworks, mais aucun ne m’a semblé aussi naturel à prendre en main que Django
Cette release a ajouté un task framework, mais c’est dommage qu’il n’inclue ni backend ni worker
J’aimerais presque qu’une version suivante l’intègre sous une forme complète
Le caractère batteries included de Django le rend adapté à n’importe quel projet, quelle qu’en soit la taille
Bravo à l’équipe et aux contributeurs
Je me demande comment nous sommes entrés dans l’ère des SPA. Est-ce qu’au départ il s’agissait simplement d’éliminer les spinners de chargement, ou y avait-il une raison plus profonde ?
En faisant partager le même backend au web, à iOS et à Android, le modèle SPA s’est naturellement généralisé
Je continue moi-même à créer des SPA, mais j’aimerais un jour réaliser un gros projet avec Django + htmx
Le fait d’obtenir un comportement d’application sans rechargement de page était séduisant, mais en pratique il fallait souvent quand même faire un rafraîchissement forcé
Malgré cela, je trouve élégante la séparation entre les données et leur représentation
Les tentatives pour transformer les documents en applications via JS se sont donc multipliées
On a fini par séparer frontend et backend, avec des contrats d’API et des procédures de validation
Plus tard, une tendance est apparue pour réintégrer tout cela via les server components, et c’est là où nous en sommes aujourd’hui
À titre d’exemple, on peut voir un ancien formulaire web à ce lien
C’est pour cela que j’ai fini par préférer les processus de build basés sur TypeScript
Chaque fois que j’utilise Django, j’éprouve simplement du plaisir. C’est tout