Vue d'ensemble

Django 1.2, publié le 17 mai 2010, apporte le support des bases de données multiples et renforce la protection CSRF. Cette version permet de lire et écrire dans plusieurs bases de données au sein d'un même projet, une fonctionnalité très demandée par la communauté.

Fonctionnalités principales

Support multi-bases de données

Django 1.2 permet de configurer et d'utiliser plusieurs bases de données simultanément. Un routeur de base de données oriente les lectures et écritures vers la bonne base selon le modèle ou l'application.

python
# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'app_principale',
    },
    'analytics': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'app_analytics',
    },
}

# Routeur de base de données
class AnalyticsRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'analytics':
            return 'analytics'
        return 'default'

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'analytics':
            return 'analytics'
        return 'default'

# Requête explicite sur une base spécifique
stats = Visite.objects.using('analytics').filter(page='/accueil/').count()

Amélioration de la protection CSRF

La protection CSRF (Cross-Site Request Forgery) est désormais activée par défaut via un middleware. Le tag {% csrf_token %} dans les templates génère le jeton de protection automatiquement.

python
# Dans le template HTML
# <form method="post">
#     {% csrf_token %}
#     <input type="text" name="titre">
#     <button type="submit">Envoyer</button>
# </form>

# Dans la vue : la vérification est automatique
from django.shortcuts import render, redirect

def creer_article(request):
    if request.method == 'POST':
        # Le middleware CSRF a déjà vérifié le jeton
        titre = request.POST['titre']
        Article.objects.create(titre=titre, auteur=request.user)
        return redirect('liste_articles')
    return render(request, 'blog/creer.html')

Sources