Vue d'ensemble
Django 3.0, publié le 2 décembre 2019, ouvre une nouvelle ère pour le framework avec l'arrivée du support ASGI (Asynchronous Server Gateway Interface). Jusqu'à présent, Django ne supportait que WSGI, un protocole synchrone. ASGI permet de tirer parti de la programmation asynchrone pour les WebSockets, le streaming et les connexions longue durée. Cette version ajoute également le support officiel de MariaDB et les choix basés sur les énumérations.
Fonctionnalités principales
Support ASGI
Django 3.0 génère un fichier asgi.py dans les nouveaux projets, à côté du traditionnel wsgi.py. Ce point d'entrée ASGI permet de déployer l'application avec des serveurs asynchrones comme Daphne ou Uvicorn. Pour l'instant, les vues restent synchrones ; le support natif des vues asynchrones arrivera dans Django 3.1.
# mon_projet/asgi.py (généré automatiquement)
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mon_projet.settings')
application = get_asgi_application()
# Déploiement avec Uvicorn
# pip install uvicorn
# uvicorn mon_projet.asgi:application --host 0.0.0.0 --port 8000
# Déploiement avec Daphne
# pip install daphne
# daphne mon_projet.asgi:application --bind 0.0.0.0 --port 8000
Support de MariaDB
MariaDB est désormais officiellement supporté en tant que backend de base de données. Bien que le backend MySQL fonctionnait déjà avec MariaDB dans la plupart des cas, le support officiel garantit des tests automatisés et une documentation dédiée.
# settings.py : configuration MariaDB
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mon_application',
'USER': 'django_user',
'PASSWORD': 'secret',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
# Vérifier la version de MariaDB
from django.db import connection
with connection.cursor() as cursor:
cursor.execute('SELECT VERSION()')
version = cursor.fetchone()[0]
print(f"MariaDB version : {version}")
# MariaDB version : 10.4.12-MariaDB
Choix basés sur les énumérations
Les classes TextChoices et IntegerChoices offrent une manière lisible et type-safe de définir les choix des champs de modèle. Elles remplacent avantageusement les tuples de constantes utilisés jusqu'ici.
from django.db import models
class Ticket(models.Model):
class Statut(models.TextChoices):
OUVERT = 'OU', 'Ouvert'
EN_COURS = 'EC', 'En cours'
RESOLU = 'RE', 'Résolu'
FERME = 'FE', 'Fermé'
class Priorite(models.IntegerChoices):
BASSE = 1, 'Basse'
NORMALE = 2, 'Normale'
HAUTE = 3, 'Haute'
CRITIQUE = 4, 'Critique'
titre = models.CharField(max_length=200)
statut = models.CharField(
max_length=2,
choices=Statut.choices,
default=Statut.OUVERT,
)
priorite = models.IntegerField(
choices=Priorite.choices,
default=Priorite.NORMALE,
)
# Utilisation
ticket = Ticket(titre='Bug page accueil', priorite=Ticket.Priorite.HAUTE)
print(ticket.get_statut_display()) # Ouvert
print(ticket.get_priorite_display()) # Haute
# Filtrage
urgents = Ticket.objects.filter(
priorite__gte=Ticket.Priorite.HAUTE,
statut=Ticket.Statut.OUVERT,
)
