Écrire un intergiciel dans Django>=1.10
Depuis Django 1.10, une classe d'intergiciel doit accepter un fichier get_response
dans son __init__()
et fournir une __call__()
méthode. Bien que cela puisse être réalisé en utilisant la méthode django.utils.deprecation.MiddlewareMixin
lors de la définition d'une classe d'intergiciel ( comme indiqué dans le réponse de W.Perrin ), la création d'un intergiciel basé sur des classes dans les versions actuellement prises en charge de Django ressemble à ceci :
class CustomMiddleware(object):
def __init__(self, get_response):
"""
One-time configuration and initialisation.
"""
self.get_response = get_response
def __call__(self, request):
"""
Code to be executed for each request before the view (and later
middleware) are called.
"""
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
"""
Called just before Django calls the view.
"""
return None
def process_exception(self, request, exception):
"""
Called when a view raises an exception.
"""
return None
def process_template_response(self, request, response):
"""
Called just after the view has finished executing.
"""
return response
En process_view()
, process_exception()
y process_template_response()
sont des hooks spéciaux, appelés par Django lors du traitement de l'intergiciel, que vous pouvez définir dans votre classe d'intergiciel. Dans l'exemple ci-dessus, les hooks implémentés ne feront rien de spécial, sauf s'assurer que Django appellera le prochain middleware pour poursuivre le traitement de la réponse/demande.
Activation du middleware
Pour activer le composant intergiciel, ajoutez-le à la section MIDDLEWARE
dans les paramètres de Django.
MIDDLEWARE = [
# Default Django middleware
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# Add your custom middleware
'path.to.your.middleware.CustomMiddleware',
]