{"title":"Signalement d’erreurs","version":"1.10","locale":"fr","docname":"howto/error-reporting","url":"/fr/1.10/howto/error-reporting/","canonical":"https://djangodocs.dev/fr/1.10/howto/error-reporting/","summary":"Lorsque vous faites fonctionner un site public, vous devriez toujours désactiver le réglage DEBUG . Cela va accélérer le serveur et évitera aussi que des…","html":"<h1>Signalement d’erreurs<a class=\"heading-anchor\" href=\"#error-reporting\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Lorsque vous faites fonctionner un site public, vous devriez toujours désactiver le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a>. Cela va accélérer le serveur et évitera aussi que des utilisateurs mal intentionnés puissent voir des détails de l’application pouvant être révélés dans les pages d’erreur.</p>\n<p>Cependant, lorsqu’un site fonctionne avec <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> réglé à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, vous ne verrez jamais les détails des erreurs générés par le site ; tout le monde voit les mêmes pages d’erreur publiques. Il est nécessaire de garder la trace des erreurs qui se produisent sur des sites en production, il est donc possible de configurer Django pour qu’il crée des rapports incluant les détails de ces erreurs.</p>\n<section id=\"email-reports\">\n<h2>Rapports par messagerie<a class=\"heading-anchor\" href=\"#email-reports\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"server-errors\">\n<h3>Erreurs de serveur<a class=\"heading-anchor\" href=\"#server-errors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, Django envoie un courriel aux utilisateurs énumérés dans le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> à chaque fois que le code génère une exception non interceptée produisant une erreur interne de serveur (code d’état HTTP 500). Les administrateurs sont ainsi notifiés immédiatement à la suite de toute erreur. Les personnes dans <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a> obtiennent une description de l’erreur, une trace Python complète ainsi que des détails sur la requête HTTP qui a causé l’erreur.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Pour pouvoir envoyer des courriels, Django a besoin de connaître certains réglages indiquant comment se connecter à un serveur de messagerie. Au minimum, il faut indiquer <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-EMAIL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST</span></code></a>, et potentiellement <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-EMAIL_HOST_USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_USER</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-EMAIL_HOST_PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">EMAIL_HOST_PASSWORD</span></code></a> ; selon la configuration du serveur de messagerie, il peut toutefois être nécessaire de définir d’autres réglages. Consultez la <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/\"><span class=\"doc\">documentation sur les réglages Django</span></a> pour une liste complète des réglages liés à l’envoi de messages électroniques.</p>\n</aside>\n<p>Par défaut, Django envoie ses messages avec l’adresse d’origine <a class=\"reference external\" href=\"mailto:root&#37;&#52;&#48;localhost\">root<span>&#64;</span>localhost</a>. Toutefois, certains fournisseurs de messagerie rejettent tous les messages provenant de cette adresse. Pour utiliser une adresse d’expéditeur différente, modifiez le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-SERVER_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SERVER_EMAIL</span></code></a>.</p>\n<p>Pour activer ce comportement, placez les adresses électroniques des destinataires dans le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-ADMINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ADMINS</span></code></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Les messages d’erreur de serveur sont envoyés par le moyen de l’infrastructure de journalisation, il est donc possible de personnaliser ce comportement en <a class=\"reference internal\" href=\"/fr/1.10/topics/logging/\"><span class=\"doc\">personnalisant la configuration de la journalisation</span></a>.</p>\n</aside>\n</section>\n<section id=\"errors\">\n<h3>Erreurs 404<a class=\"heading-anchor\" href=\"#errors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django peut aussi être configuré pour envoyer des courriels pour des erreurs de lien cassé (erreurs 404 « page non trouvée »). Django envoie des courriels lors d’erreurs 404 si :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>;</p></li>\n<li><p>Votre réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> contient <a class=\"reference internal\" href=\"/fr/1.10/ref/middleware/#django.middleware.common.BrokenLinkEmailsMiddleware\" title=\"django.middleware.common.BrokenLinkEmailsMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.middleware.common.BrokenLinkEmailsMiddleware</span></code></a>.</p></li>\n</ul>\n<p>Si ces conditions sont remplies, Django envoie un courriel aux utilisateurs mentionnés dans le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-MANAGERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MANAGERS</span></code></a> chaque fois que le code signale une erreur 404 et que la requête possède une URL référente (« referer »). Il ne prend pas la peine d’envoyer un courriel pour une erreur 404 sans URL référente, car il s’agit généralement de personnes ayant mal saisi une adresse ou de robots Web défectueux. Il ignore aussi les erreurs 404 lorsque l’URL référente est la même que l’URL demandée, car ce comportement est aussi typique des robots Web défectueux.</p>\n<aside class=\"version-note version-changed\" data-version=\"1.9\">\n<p class=\"version-note-title\">Changed in Django 1.9</p><p>Dans les anciennes versions, les erreurs 404 n’étaient pas ignorées lorsque l’URL référente était la même que l’URL demandée.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/middleware/#django.middleware.common.BrokenLinkEmailsMiddleware\" title=\"django.middleware.common.BrokenLinkEmailsMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BrokenLinkEmailsMiddleware</span></code></a> doit apparaître avant tout autre intergiciel interceptant les erreurs 404, tel que <a class=\"reference internal\" href=\"/fr/1.10/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code></a> ou <a class=\"reference internal\" href=\"/fr/1.10/ref/contrib/flatpages/#django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\" title=\"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FlatpageFallbackMiddleware</span></code></a>. Placez-le dans les premières lignes du réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>.</p>\n</aside>\n<p>Il est possible d’indiquer à Django de ne pas signaler certaines erreurs 404 en ajustant le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-IGNORABLE_404_URLS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">IGNORABLE_404_URLS</span></code></a>. Celui-ci est une liste d’expressions régulières compilées. Par exemple :</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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">re</span>\n<span class=\"n\">IGNORABLE_404_URLS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;\\.(php|cgi)$&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^/phpmyadmin/&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Dans cet exemple, une erreur 404 vers toute URL se terminant par <code class=\"docutils literal notranslate\"><span class=\"pre\">.php</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">.cgi</span></code> ne sera <em>pas</em> signalée. Ni aucune URL commençant par <code class=\"docutils literal notranslate\"><span class=\"pre\">/phpmyadmin/</span></code>.</p>\n<p>L’exemple suivant montre comment exclure certaines URL conventionnellement demandées par les navigateurs et les robots :</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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">re</span>\n<span class=\"n\">IGNORABLE_404_URLS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^/apple-touch-icon.*\\.png$&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^/favicon\\.ico$&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^/robots\\.txt$&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>(Notez qu’il s’agit d’expressions régulières, d’où la présence de la barre oblique inverse devant les points pour les échapper.)</p>\n<p>Si vous souhaitez personnaliser davantage le comportement de <a class=\"reference internal\" href=\"/fr/1.10/ref/middleware/#django.middleware.common.BrokenLinkEmailsMiddleware\" title=\"django.middleware.common.BrokenLinkEmailsMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.middleware.common.BrokenLinkEmailsMiddleware</span></code></a> (par exemple pour ignorer les requêtes en provenance de robots Web), vous devez créer une sous-classe et surcharger ses méthodes.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Les erreurs 404 sont journalisées en utilisant l’infrastructure de journalisation. Par défaut, ces entrées de journal sont ignorées, mais vous pouvez les utiliser pour le signalement d’erreurs en écrivant un gestionnaire et en <a class=\"reference internal\" href=\"/fr/1.10/topics/logging/\"><span class=\"doc\">configurant la journalisation</span></a> en conséquence.</p>\n</aside>\n</section>\n</section>\n<section id=\"filtering-error-reports\">\n<span id=\"id1\"></span><h2>Filtrage de rapports d’erreur<a class=\"heading-anchor\" href=\"#filtering-error-reports\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Le filtrage des données sensibles est un problème ardu, et il est quasiment impossible de garantir qu’aucune donnée sensible ne figurera dans un rapport d’erreur. Il faudrait donc limiter l’accès aux rapports d’erreurs aux membres de votre équipe dignes de confiance et éviter de transmettre ces rapports de manière non chiffrée par Internet (comme par exemple par messagerie électronique).</p>\n</aside>\n<section id=\"filtering-sensitive-information\">\n<h3>Filtrage des informations sensibles<a class=\"heading-anchor\" href=\"#filtering-sensitive-information\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les rapports d’erreur sont vraiment utiles pour déboguer les erreurs, il est donc généralement utile de récolter le maximum d’informations à leur sujet. Par défaut, Django récolte une <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Stack_trace\">trace complète</a> de l’exception levée, les variables locales de chaque <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Stack_frame\">contexte de trace</a> et les <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#httprequest-attributes\"><span class=\"std std-ref\">attributs</span></a> de l’objet <a class=\"reference internal\" href=\"/fr/1.10/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>Il peut cependant arriver que certains types d’information soient trop sensibles et qu’il n’est pas adéquat d’en conserver la trace, par exemple un mot de passe ou un numéro de carte de crédit. En plus d’exclure les réglages apparaissant comme sensibles selon ce qui est expliqué dans la documentation de <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a>, Django offre donc un ensemble de fonctions décoratrices pour vous aider à contrôler les informations qui ne devraient pas apparaître dans les rapports d’erreur dans un environnement de production (c’est-à-dire quand <a class=\"reference internal\" href=\"/fr/1.10/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\">False</span></code>) : <a class=\"reference internal\" href=\"#django.views.decorators.debug.sensitive_variables\" title=\"django.views.decorators.debug.sensitive_variables\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sensitive_variables()</span></code></a> et <a class=\"reference internal\" href=\"#django.views.decorators.debug.sensitive_post_parameters\" title=\"django.views.decorators.debug.sensitive_post_parameters\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sensitive_post_parameters()</span></code></a>.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.debug.sensitive_variables\">\n<span class=\"sig-name descname\"><span class=\"pre\">sensitive_variables</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">variables</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.debug.sensitive_variables\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si une fonction (une vue ou toute autre fonction de rappel) de votre code utilise des variables locales susceptibles de contenir des informations sensibles, vous pouvez empêcher les valeurs de ces variables d’apparaître dans les rapports d’erreur en utilisant le décorateur <code class=\"docutils literal notranslate\"><span class=\"pre\">sensitive_variables</span></code>:</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.debug</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sensitive_variables</span>\n\n<span class=\"nd\">@sensitive_variables</span><span class=\"p\">(</span><span class=\"s1\">&#39;user&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pw&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;cc&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">process_info</span><span class=\"p\">(</span><span class=\"n\">user</span><span class=\"p\">):</span>\n    <span class=\"n\">pw</span> <span class=\"o\">=</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">pass_word</span>\n    <span class=\"n\">cc</span> <span class=\"o\">=</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">credit_card_number</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">name</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Dans l’exemple ci-dessus, les valeurs des variables <code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">pw</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">cc</span></code> seront masquées et remplacées par des étoiles (**********) dans les rapports d’erreur, tandis que la valeur de la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> sera visible.</p>\n<p>Pour masquer systématiquement toutes les variables locales d’une fonction dans les journaux d’erreurs, n’indiquez aucun paramètre au décorateur <code class=\"docutils literal notranslate\"><span class=\"pre\">sensitive_variables</span></code>:</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=\"nd\">@sensitive_variables</span><span class=\"p\">()</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_function</span><span class=\"p\">():</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<aside class=\"admonition-when-using-multiple-decorators admonition\">\n<p class=\"admonition-title\">Utilisation de plusieurs décorateurs</p>\n<p>Si la variable que vous voulez masquer est également un paramètre de fonction (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code> dans l’exemple suivant) et si la fonction décorée possède plusieurs décorateurs, prenez soin de placer <code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;sensitive_variables</span></code> au sommet de la chaîne des décorateurs. De cette façon, le paramètre de fonction sera aussi masqué tout en passant par les autres décorateurs :</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=\"nd\">@sensitive_variables</span><span class=\"p\">(</span><span class=\"s1\">&#39;user&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pw&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;cc&#39;</span><span class=\"p\">)</span>\n<span class=\"nd\">@some_decorator</span>\n<span class=\"nd\">@another_decorator</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">process_info</span><span class=\"p\">(</span><span class=\"n\">user</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</aside>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.debug.sensitive_post_parameters\">\n<span class=\"sig-name descname\"><span class=\"pre\">sensitive_post_parameters</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">parameters</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.debug.sensitive_post_parameters\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Si l’une de vos vues reçoit un objet <a class=\"reference internal\" href=\"/fr/1.10/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> avec des <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">paramètres</span> <span class=\"pre\">POST</span></code></a> susceptibles de contenir des informations sensibles, vous pouvez empêcher les valeurs de ces paramètres d’apparaître dans les rapports d’erreur en utilisant le décorateur <code class=\"docutils literal notranslate\"><span class=\"pre\">sensitive_post_parameters</span></code>:</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.debug</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sensitive_post_parameters</span>\n\n<span class=\"nd\">@sensitive_post_parameters</span><span class=\"p\">(</span><span class=\"s1\">&#39;pass_word&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;credit_card_number&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">record_user_profile</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">UserProfile</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n        <span class=\"n\">user</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">,</span>\n        <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s1\">&#39;pass_word&#39;</span><span class=\"p\">],</span>\n        <span class=\"n\">credit_card</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s1\">&#39;credit_card_number&#39;</span><span class=\"p\">],</span>\n        <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">],</span>\n    <span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Dans l’exemple ci-dessus, les valeurs des paramètres POST <code class=\"docutils literal notranslate\"><span class=\"pre\">pass_word</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">credit_card_number</span></code> seront masquées et remplacées par des étoiles (**********) dans la représentation de la requête dans le rapport d’erreur, tandis que la valeur du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> sera visible.</p>\n<p>Pour masquer systématiquement tous les paramètres POST d’une requête dans les rapports d’erreur, n’indiquez aucun paramètre au décorateur <code class=\"docutils literal notranslate\"><span class=\"pre\">sensitive_post_parameters</span></code>:</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=\"nd\">@sensitive_post_parameters</span><span class=\"p\">()</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Tous les paramètres POST sont systématiquement masqués dans les rapports d’erreur pour certaines vues <a class=\"reference internal\" href=\"/fr/1.10/topics/auth/default/#module-django.contrib.auth.views\" title=\"django.contrib.auth.views\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.views</span></code></a> ( <code class=\"docutils literal notranslate\"><span class=\"pre\">login</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">password_reset_confirm</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">password_change</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">add_view</span></code>, ainsi que <code class=\"docutils literal notranslate\"><span class=\"pre\">user_change_password</span></code> dans l’administration de <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>) pour empêcher la divulgation d’informations sensibles comme les mots de passe.</p>\n</dd></dl>\n\n</section>\n<section id=\"custom-error-reports\">\n<span id=\"id2\"></span><h3>Rapports d’erreur personnalisés<a class=\"heading-anchor\" href=\"#custom-error-reports\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tout ce que font <a class=\"reference internal\" href=\"#django.views.decorators.debug.sensitive_variables\" title=\"django.views.decorators.debug.sensitive_variables\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sensitive_variables()</span></code></a> et <a class=\"reference internal\" href=\"#django.views.decorators.debug.sensitive_post_parameters\" title=\"django.views.decorators.debug.sensitive_post_parameters\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sensitive_post_parameters()</span></code></a>, c’est respectivement annoter la fonction décorée avec les noms des varaibles sensibles et annoter l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> avec les noms des paramètres POST sensibles, afin que ces informations sensibles puissent être plus tard filtrées des rapports lorsqu’une erreur se produit. Le vrai filtrage est effectué par le filtre de rapport d’erreur par défaut de Django, <a class=\"reference internal\" href=\"#django.views.debug.SafeExceptionReporterFilter\" title=\"django.views.debug.SafeExceptionReporterFilter\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.views.debug.SafeExceptionReporterFilter</span></code></a>. Ce filtre utilise les annotations des décorateurs pour remplacer les valeurs correspondantes par des étoiles (**********) au moment de la production du rapport d’erreur. Si vous souhaitez surcharger ou personnaliser ce comportement par défaut pour tout votre site, vous devez définir votre propre classe de filtre et indiquer à Django de l’utiliser par le moyen du réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEFAULT_EXCEPTION_REPORTER_FILTER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_EXCEPTION_REPORTER_FILTER</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\">DEFAULT_EXCEPTION_REPORTER_FILTER</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;path.to.your.CustomExceptionReporterFilter&#39;</span>\n</code></pre></div>\n<p>Vous pouvez aussi contrôler d’une manière plus fine le filtre qu’une vue données doit utiliser en définissant l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">exception_reporter_filter</span></code> de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code>.</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\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_authenticated</span><span class=\"p\">:</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">exception_reporter_filter</span> <span class=\"o\">=</span> <span class=\"n\">CustomExceptionReporterFilter</span><span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Votre classe de filtre personnalisée doit hériter de <a class=\"reference internal\" href=\"#django.views.debug.SafeExceptionReporterFilter\" title=\"django.views.debug.SafeExceptionReporterFilter\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.views.debug.SafeExceptionReporterFilter</span></code></a> et peut surcharger les méthodes suivantes :</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.debug.SafeExceptionReporterFilter\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SafeExceptionReporterFilter</span></span><a class=\"heading-anchor\" href=\"#django.views.debug.SafeExceptionReporterFilter\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.debug.SafeExceptionReporterFilter.is_active\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">SafeExceptionReporterFilter.</span></span><span class=\"sig-name descname\"><span class=\"pre\">is_active</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=\"#django.views.debug.SafeExceptionReporterFilter.is_active\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> pour activer le filtrage opéré par les autres méthodes. Par défaut, le filtrage est actif si <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.debug.SafeExceptionReporterFilter.get_post_parameters\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">SafeExceptionReporterFilter.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_post_parameters</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=\"#django.views.debug.SafeExceptionReporterFilter.get_post_parameters\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie le dictionnaire des paramètres POST filtré. Par défaut, il remplace les valeurs des données sensibles par des étoiles (**********).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.debug.SafeExceptionReporterFilter.get_traceback_frame_variables\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">SafeExceptionReporterFilter.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_traceback_frame_variables</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\">tb_frame</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.debug.SafeExceptionReporterFilter.get_traceback_frame_variables\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie le dictionnaire filtré des variables locales du contexte de trace donné. Par défaut, il remplace les valeurs des variables sensibles par des étoiles (**********).</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Il est aussi imaginable de personnaliser les rapports d’erreurs en écrivant un <a class=\"reference internal\" href=\"/fr/1.10/topics/http/middleware/#exception-middleware\"><span class=\"std std-ref\">middleware d’exception</span></a> approprié. Dans ce cas, il est conseillé d’imiter la gestion d’erreur intégrée dans Django et de ne notifier les erreurs que dans le cas où <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</aside>\n</section>\n</section>","rootId":"error-reporting","toc":[{"title":"Rapports par messagerie","anchor":"email-reports","children":[{"title":"Erreurs de serveur","anchor":"server-errors","children":[]},{"title":"Erreurs 404","anchor":"errors","children":[]}]},{"title":"Filtrage de rapports d’erreur","anchor":"filtering-error-reports","children":[{"title":"Filtrage des informations sensibles","anchor":"filtering-sensitive-information","children":[]},{"title":"Rapports d’erreur personnalisés","anchor":"custom-error-reports","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"Guides pratiques","url":"/fr/1.10/howto/"}],"prev":{"docname":"howto/upgrade-version","title":"Mise à jour de Django à une version plus récente","url":"/fr/1.10/howto/upgrade-version/"},"next":{"docname":"howto/initial-data","title":"Données initiales pour les modèles","url":"/fr/1.10/howto/initial-data/"},"formats":{"html":"/fr/1.10/howto/error-reporting/","markdown":"/fr/1.10/howto/error-reporting.md","json":"/fr/1.10/howto/error-reporting.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/howto/error-reporting.txt","official":"https://docs.djangoproject.com/fr/1.10/howto/error-reporting/","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","el","pl"]}