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.

python
# 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.

python
# 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.

python
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,
)

Sources