Vue d'ensemble
Django 1.10, publié le 1er août 2016, introduit la recherche plein texte pour PostgreSQL et refond le système de middlewares. Le nouveau réglage MIDDLEWARE remplace MIDDLEWARE_CLASSES avec une architecture simplifiée. La recherche plein texte offre des capacités avancées de recherche directement intégrées dans l'ORM.
Fonctionnalités principales
Recherche plein texte PostgreSQL
Le module django.contrib.postgres.search fournit des outils de recherche plein texte natifs pour PostgreSQL. On dispose de SearchVector, SearchQuery, SearchRank et de la recherche trigramme pour des recherches approximatives.
from django.contrib.postgres.search import (
SearchVector, SearchQuery, SearchRank,
)
# Recherche simple sur plusieurs champs
resultats = Article.objects.annotate(
recherche=SearchVector('titre', 'contenu'),
).filter(recherche='django migrations')
# Recherche avec classement par pertinence
vecteur = SearchVector('titre', weight='A') + SearchVector('contenu', weight='B')
requete = SearchQuery('performance optimisation')
resultats_classes = (
Article.objects
.annotate(rang=SearchRank(vecteur, requete))
.filter(rang__gte=0.1)
.order_by('-rang')
)
Nouveau système de middleware
Le réglage MIDDLEWARE remplace MIDDLEWARE_CLASSES. Les nouveaux middlewares sont des callables simples au lieu de classes avec des méthodes spécifiques, ce qui rend leur écriture plus intuitive.
import time
# Middleware sous forme de fonction
def middleware_temps_reponse(get_response):
"""Mesure le temps de traitement de chaque requête."""
def middleware(request):
debut = time.time()
response = get_response(request)
duree = time.time() - debut
response['X-Temps-Reponse'] = f'{duree:.3f}s'
return response
return middleware
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'monprojet.middleware.middleware_temps_reponse',
]
