{"title":"Intergiciels (« Middleware »)","version":"1.9","locale":"fr","docname":"topics/http/middleware","url":"/fr/1.9/topics/http/middleware/","canonical":"https://djangodocs.dev/fr/1.9/topics/http/middleware/","summary":"Les intergiciels représentent un système de points d’entrée dans le traitement des requêtes et des réponses de Django. C’est un système de greffons léger et de bas…","html":"<h1>Intergiciels (« Middleware »)<a class=\"heading-anchor\" href=\"#middleware\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Les intergiciels représentent un système de points d’entrée dans le traitement des requêtes et des réponses de Django. C’est un système de greffons léger et de bas niveau pour modifier de façon globale les entrées et sorties HTTP de Django.</p>\n<p>Chaque composant d’intergiciel est responsable d’effectuer une tâche spécifique. Par exemple, Django contient un intergiciel, <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code></a>, qui associe les utilisateurs aux requêtes et aux sessions.</p>\n<p>Ce document explique comment fonctionnent les intergiciels, la manière de les activer et d’écrire vos propres intergiciels. Django est livré avec quelques intergiciels intégrés qu’il est possible d’utiliser tels quels. Ils sont documentés dans la <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/\"><span class=\"doc\">référence des intergiciels intégrés</span></a>.</p>\n<section id=\"activating-middleware\">\n<h2>Activation des intergiciels<a class=\"heading-anchor\" href=\"#activating-middleware\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour activer un intergiciel, ajoutez son chemin dans la liste <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a> de vos réglages Django.</p>\n<p>Dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a>, chaque intergiciel est représenté par une chaîne : le chemin Python complet vers le nom de la classe d’intergiciel. Par exemple, voici la valeur par défaut créée par <a class=\"reference internal\" href=\"/fr/1.9/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE_CLASSES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;django.middleware.security.SecurityMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.common.CommonMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.csrf.CsrfViewMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.SessionAuthenticationMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.messages.middleware.MessageMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Une installation de Django n’a pas nécessairement des intergiciels, <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a> pouvant très bien être vide si vous le souhaitez, mais il est fortement recommandé d’utiliser au moins <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/#django.middleware.common.CommonMiddleware\" title=\"django.middleware.common.CommonMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code></a>.</p>\n<p>L’ordre dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a> a son importance car un intergiciel peut dépendre d’un autre. Par exemple, <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code></a> stocke l’utilisateur non authentifié dans la session ; il doit donc être exécuté après <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/#django.contrib.sessions.middleware.SessionMiddleware\" title=\"django.contrib.sessions.middleware.SessionMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code></a>. Voir <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/#middleware-ordering\"><span class=\"std std-ref\">Ordre des intergiciels</span></a> pour d’autres indications utiles concernant l’ordre des classes d’intergiciel de Django.</p>\n</section>\n<section id=\"hooks-and-application-order\">\n<h2>Points d’entrée et ordre des applications<a class=\"heading-anchor\" href=\"#hooks-and-application-order\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Durant la phase de requête, avant d’appeler la vue, Django applique les intergiciels dans l’ordre où ils sont définis dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a>, de haut en bas. Deux points d’entrée sont disponibles :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#process_request\" title=\"process_request\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">process_request()</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#process_view\" title=\"process_view\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">process_view()</span></code></a></p></li>\n</ul>\n<p>Durant la phase de réponse, après avoir appelé la vue, Django applique les intergiciels dans l’ordre inverse de leur définition, de bas en haut. Trois points d’entrée sont disponibles :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#process_exception\" title=\"process_exception\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code></a> (seulement si la vue a généré une exception)</p></li>\n<li><p><a class=\"reference internal\" href=\"#process_template_response\" title=\"process_template_response\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code></a> (seulement pour les réponses basées sur des gabarits)</p></li>\n<li><p><a class=\"reference internal\" href=\"#process_response\" title=\"process_response\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">process_response()</span></code></a></p></li>\n</ul>\n<a class=\"reference internal image-reference\" href=\"../../../../../../_images/middleware.svg\"><img alt=\"middleware application order\" src=\"/fr/1.9/_images/middleware.svg\" style=\"width: 481px; height: 409px;\" />\n</a>\n<p>Si vous préférez, on peut comparer ce système à un oignon : chaque classe d’intergiciel est une « pelure » qui englobe la vue.</p>\n<p>Le comportement de chaque point d’entrée est décrit ci-dessous.</p>\n</section>\n<section id=\"writing-your-own-middleware\">\n<h2>Écriture de son propre intergiciel<a class=\"heading-anchor\" href=\"#writing-your-own-middleware\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il est facile d’écrire un intergiciel. Chaque intergiciel est une classe Python unique qui définit l’une ou plusieurs des méthodes suivantes :</p>\n<section id=\"process-request\">\n<span id=\"request-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code><a class=\"heading-anchor\" href=\"#process-request\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_request\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_request</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_request\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> est un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code> est appelée pour chaque requête, avant que Django ne décide quelle vue exécuter.</p>\n<p>Elle doit renvoyer soit <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, soit un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>. Si elle renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, Django continue le traitement de la requête, en appliquant d’éventuels autres intergiciels <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code>, puis les intergiciels <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> et pour terminer exécute la vue appropriée. Si elle renvoie un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>, Django n’applique plus aucun intergiciel de requête, de vue ou d’exception, ni la vue correspondante ; il va simplement appliquer les intergiciels de réponse à cet objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> et renvoyer le résultat.</p>\n</section>\n<section id=\"process-view\">\n<span id=\"view-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code><a class=\"heading-anchor\" href=\"#process-view\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_view\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_view</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_func</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_args</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_view\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> est un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">view_func</span></code> et la fonction python que Django s’apprête à utiliser (il s’agit bien de l’objet fonction, pas du nom textuel de la fonction). <code class=\"docutils literal notranslate\"><span class=\"pre\">view_args</span></code> est une liste de paramètres positionnels qui seront transmis à la vue, et <code class=\"docutils literal notranslate\"><span class=\"pre\">view_kwargs</span></code> est un dictionnaire de paramètres nommés qui seront transmis à la vue. Ni <code class=\"docutils literal notranslate\"><span class=\"pre\">view_args</span></code> ni <code class=\"docutils literal notranslate\"><span class=\"pre\">view_kwargs</span></code> ne comprennent le premier paramètre de la vue (<code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>).</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> est appelée juste avant que Django n’appelle la vue.</p>\n<p>Elle doit renvoyer soit <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, soit un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>. Si elle renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, Django continue le traitement de la requête, en appliquant d’éventuels autres intergiciels <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code>, puis exécute la vue appropriée. Si elle renvoie un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>, Django n’applique plus aucun intergiciel de vue ou d’exception, ni la vue correspondante ; il va simplement appliquer les intergiciels de réponse à cet objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> et renvoyer le résultat.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>L’accès à <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.POST</span></code></a> depuis un intergiciel dans ses méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view</span></code> empêche toute vue exécutée après les intergiciels de pouvoir <a class=\"reference internal\" href=\"/fr/1.9/topics/http/file-uploads/#modifying-upload-handlers-on-the-fly\"><span class=\"std std-ref\">modifier les gestionnaires de téléversement de la requête</span></a>, et devrait donc être évité.</p>\n<p>La classe <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CsrfViewMiddleware</span></code></a> peut être considérée comme une exception, car elle fournit les décorateurs <a class=\"reference internal\" href=\"/fr/1.9/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_exempt()</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.9/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_protect()</span></code></a> qui permettent aux vues de contrôler explicitement le moment de la validation CSRF.</p>\n</aside>\n</section>\n<section id=\"process-template-response\">\n<span id=\"template-response-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code><a class=\"heading-anchor\" href=\"#process-template-response\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_template_response\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_template_response</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">response</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_template_response\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> est un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> est l’objet <a class=\"reference internal\" href=\"/fr/1.9/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> (ou équivalent) renvoyé par une vue Django ou par un intergiciel.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code> est appelée juste après la fin de l’exécution de la vue, pour autant que l’instance réponse possède une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>, ce qui laisse penser qu’il s’agit d’un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> ou d’un équivalent.</p>\n<p>Elle doit renvoyer un objet réponse qui implémente une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>. Elle peut modifier la réponse donnée en changeant <code class=\"docutils literal notranslate\"><span class=\"pre\">response.template_name</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">response.context_data</span></code>, ou elle peut créer et renvoyer une toute nouvelle classe <a class=\"reference internal\" href=\"/fr/1.9/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> ou un équivalent.</p>\n<p>Il n’est pas nécessaire d’effectuer explicitement le rendu des réponses, celles-ci étant automatiquement « rendues » après que tous les intergiciels de réponse ont été appelés.</p>\n<p>Les intergiciels sont exécutés dans l’ordre inverse lors de la phase de réponse, ce qui inclut <code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code>.</p>\n</section>\n<section id=\"process-response\">\n<span id=\"response-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_response()</span></code><a class=\"heading-anchor\" href=\"#process-response\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_response\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_response</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">response</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_response\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> est un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> est l’objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> ou <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> renvoyé par une vue Django ou par un intergiciel.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_response()</span></code> est appelée pour toutes les réponses avant qu’elles soient renvoyées au navigateur.</p>\n<p>Elle doit renvoyer un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> ou <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a>. Elle peut modifier la réponse donnée ou elle peut créer et renvoyer une toute nouvelle instance de <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> ou de <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a>.</p>\n<p>Au contraire des méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code>, la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response()</span></code> est toujours appelée, même si les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> de la même classe d’intergiciel ont été court-circuitées (parce qu’une méthode d’intergiciel précédente a renvoyé une réponse <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>). En particulier,  ceci implique que votre méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response()</span></code> ne peut pas compter sur une configuration créée dans <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code>.</p>\n<p>Pour terminer, rappelez-vous que durant la phase de réponse, les intergiciels sont appliqués dans l’ordre inverse, de bas en haut. Cela signifie que les classes définies à la fin de <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a> sont exécutées en premier.</p>\n<section id=\"dealing-with-streaming-responses\">\n<h4>Gestion des réponses en flux<a class=\"heading-anchor\" href=\"#dealing-with-streaming-responses\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Au contraire de <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>, <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> ne possède pas d’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>. En conséquence, les intergiciels ne peuvent plus compter sur le fait que toutes les réponses possèdent un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>. S’ils ont besoin d’accéder au contenu, ils doivent savoir s’ils ont affaire avec une réponse de type flux (streaming) et ajuster leur comportement en fonction de cela :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming</span><span class=\"p\">:</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming_content</span> <span class=\"o\">=</span> <span class=\"n\">wrap_streaming_content</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming_content</span><span class=\"p\">)</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">alter_content</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">content</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Il faut toujours partir du principe que <code class=\"docutils literal notranslate\"><span class=\"pre\">streaming_content</span></code> est trop volumineux pour être stocké en mémoire. Les intergiciels de réponse peuvent l’adapter dans un nouveau générateur, mais ils ne devraient pas le consommer. L’adaptation s’implémente typiquement de cette façon :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">wrap_streaming_content</span><span class=\"p\">(</span><span class=\"n\">content</span><span class=\"p\">):</span>\n    <span class=\"k\">for</span> <span class=\"n\">chunk</span> <span class=\"ow\">in</span> <span class=\"n\">content</span><span class=\"p\">:</span>\n        <span class=\"k\">yield</span> <span class=\"n\">alter_content</span><span class=\"p\">(</span><span class=\"n\">chunk</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n</section>\n<section id=\"process-exception\">\n<span id=\"exception-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code><a class=\"heading-anchor\" href=\"#process-exception\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_exception\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_exception</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_exception\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> est un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. <code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code> est un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Exception</span></code> généré par la fonction de vue.</p>\n<p>Django appelle <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code> lorsqu’une vue génère une exception. <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code> doit renvoyer <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> ou un objet <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>. Si elle renvoie un objet  <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>, les intergiciels de réponse par gabarit et de réponse sont appliqués, et la réponse résultante sera renvoyée au navigateur. Sinon, la gestion par défaut des exceptions intervient.</p>\n<p>Encore une fois, les intergiciels sont exécutés dans l’ordre inverse lors de la phase de réponse, ce qui comprend <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code>. Si un intergiciel d’exception renvoie une réponse, les classes d’intergiciels situées au-dessus ne seront pas du tout appelées.</p>\n</section>\n<section id=\"init\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code><a class=\"heading-anchor\" href=\"#init\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La plupart des classes d’intergiciels ne nécessitent pas d’initialisation dans la mesure où elles sont essentiellement des conteneurs pour les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">process_*</span></code>. Si vous avez besoin d’une notion d’état global, il est possible d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> pour cela. Cependant, gardez à l’esprit ces restrictions :</p>\n<ul class=\"simple\">\n<li><p>Django initialise les intergiciels sans paramètre, il n’est donc pas possible de définir des paramètres obligatoires à <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code>.</p></li>\n<li><p>Contrairement aux méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">process_*</span></code> qui sont appelées une fois par requête, <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> n’est appelée qu”<em>une seule fois</em>, lorsque le serveur Web répond à la première requête.</p></li>\n</ul>\n<section id=\"marking-middleware-as-unused\">\n<h4>Signalement d’un intergiciel à exclure<a class=\"heading-anchor\" href=\"#marking-middleware-as-unused\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Il est parfois utile de déterminer au moment de l’exécution si un intergiciel doit être utilisé. Dans ces cas, la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> de l’intergiciel peut générer l’exception <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.exceptions.MiddlewareNotUsed</span></code>. Django se charge alors d’enlever cet intergiciel du processus des intergiciels et un message de débogage est journalisé vers <code class=\"docutils literal notranslate\"><span class=\"pre\">django.request</span></code> lorsque  <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"1.8\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Précédemment, les exceptions <a class=\"reference internal\" href=\"/fr/1.9/ref/exceptions/#django.core.exceptions.MiddlewareNotUsed\" title=\"django.core.exceptions.MiddlewareNotUsed\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">MiddlewareNotUsed</span></code></a> n’étaient pas journalisées.</p>\n</aside>\n</section>\n</section>\n<section id=\"guidelines\">\n<h3>Lignes de conduite<a class=\"heading-anchor\" href=\"#guidelines\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>Les classes d’intergiciels n’ont aucune obligation d’héritage.</p></li>\n<li><p>Une classe d’intergiciel peut se trouver n’importe où dans le chemin Python. Tout ce que Django demande, c’est que le réglage <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-MIDDLEWARE_CLASSES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code></a> contienne le chemin de l’intergiciel.</p></li>\n<li><p>N’hésitez pas à examiner les <a class=\"reference internal\" href=\"/fr/1.9/ref/middleware/\"><span class=\"doc\">intergiciels disponibles dans Django</span></a> pour avoir des exemples.</p></li>\n<li><p>Si vous écrivez un composant intergiciel que vous pensez susceptible d’être utilisé par d’autres personnes, contribuez à la communauté ! <a class=\"reference internal\" href=\"/fr/1.9/internals/contributing/\"><span class=\"doc\">Faites-le nous savoir</span></a> et nous considérerons son éventuel ajout dans Django.</p></li>\n</ul>\n</section>\n</section>","rootId":"middleware","toc":[{"title":"Activation des intergiciels","anchor":"activating-middleware","children":[]},{"title":"Points d’entrée et ordre des applications","anchor":"hooks-and-application-order","children":[]},{"title":"Écriture de son propre intergiciel","anchor":"writing-your-own-middleware","children":[{"title":"process_request()","anchor":"process-request","children":[]},{"title":"process_view()","anchor":"process-view","children":[]},{"title":"process_template_response()","anchor":"process-template-response","children":[]},{"title":"process_response()","anchor":"process-response","children":[{"title":"Gestion des réponses en flux","anchor":"dealing-with-streaming-responses","children":[]}]},{"title":"process_exception()","anchor":"process-exception","children":[]},{"title":"__init__()","anchor":"init","children":[{"title":"Signalement d’un intergiciel à exclure","anchor":"marking-middleware-as-unused","children":[]}]},{"title":"Lignes de conduite","anchor":"guidelines","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/1.9/topics/"},{"docname":"topics/http/index","title":"Gestion des requêtes HTTP","url":"/fr/1.9/topics/http/"}],"prev":{"docname":"topics/http/generic-views","title":"Vues génériques","url":"/fr/1.9/topics/http/generic-views/"},"next":{"docname":"topics/http/sessions","title":"Utilisation des sessions","url":"/fr/1.9/topics/http/sessions/"},"formats":{"html":"/fr/1.9/topics/http/middleware/","markdown":"/fr/1.9/topics/http/middleware.md","json":"/fr/1.9/topics/http/middleware.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/topics/http/middleware.txt","official":"https://docs.djangoproject.com/fr/1.9/topics/http/middleware/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}