---
title: "Infrastructure de contrôle système"
version: 2.0
locale: fr
source: https://docs.djangoproject.com/fr/2.0/ref/checks/
canonical: https://djangodocs.dev/fr/2.0/ref/checks/
---
# Infrastructure de contrôle système

L’infrastructure de contrôle système est un ensemble de contrôles statiques pour valider les projets Django. Elle détecte les problèmes courants et fournit des conseils sur la façon de les corriger. L’infrastructure est extensible de sorte que vous pouvez facilement ajouter vos propres contrôles.

Pour plus de détails sur la façon d’ajouter vos propres contrôles et les intégrer aux contrôles systèmes de Django, consultez le [Guide thématique sur la vérification système](/fr/2.0/topics/checks/).

## Référence de l’API

### `CheckMessage`

#### `class CheckMessage(level, msg, hint=None, obj=None, id=None)`

Les avertissements et les erreurs signalés par les contrôles systèmes doivent être des instances de `CheckMessage`. Une instance encapsule une seule erreur à signaler ou un seul avertissement. Elle fournit également des indicateurs et le contexte applicables au message, et un identifiant unique qui est utilisé à des fins de filtrage.

Les arguments du constructeur sont :

**`level`**

  La gravité du message. Utilisez l’une des valeurs prédéfinies : `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. Si le niveau est supérieur ou égal à `ERROR`, Django empêchera l’exécution des commandes de gestion. Les messages avec un niveau inférieur à `ERROR` (i.e. les avertissements) sont présentés dans la console, mais peuvent être réduits au silence.

**`msg`**

  Une courte chaîne (moins de 80 caractères) décrivant le problème. La chaîne ne doit *pas* contenir des sauts de ligne.

**`hint`**

  Une chaîne d’une seule ligne offrant un indicateur pour résoudre le problème. Si aucun indicateur ne peut être fourni, ou s’il est évident à partir du message d’erreur, l’indicateur peut être omis, ou une valeur `None` peut être utilisée.

**`obj`**

  Facultatif. Un objet fournissant le contexte du message (par exemple, le modèle où le problème a été découvert). L’objet doit être un modèle, un champ, un gestionnaire ou tout autre objet qui définit la méthode `__str__()`. La méthode est utilisée lors de la collecte de tous les messages et son résultat précède le message.

**`id`**

  Chaîne facultative. Un identifiant unique pour le problème. Les identifiants doivent suivre le modèle `applabel.X001`, où `X` est l’une des lettres `CEWID`, indiquant la gravité du message (`C` pour critique, `E` pour les erreurs et ainsi de suite). Le numéro peut être attribué par l’application, mais doit être unique au sein de cette application.

Il existe des sous-classes pour faciliter la création des messages avec les niveaux de base. Lorsque vous les utilisez, vous pouvez omettre le paramètre `level` car il est sous-entendu par le nom de la classe.

#### `class Debug(msg, hint=None, obj=None, id=None)`

#### `class Info(msg, hint=None, obj=None, id=None)`

#### `class Warning(msg, hint=None obj=None, id=None)`

#### `class Error(msg, hint=None, obj=None, id=None)`

#### `class Critical(msg, hint=None, obj=None, id=None)`

## Étiquettes prédéfinies

Les contrôles systèmes de Django sont organisés en utilisant les étiquettes suivantes :

- `admin`: contrôles de toutes les déclarations de sites d’administration.
- `caches`: contrôle la configuration liée aux caches (mémoire tampon).
- `compatibility`: identification de problèmes potentiels avec les mises à jour.
- `database`: vérifie des problèmes de configuration liés aux bases de données. Les contrôles de base de données ne sont pas exécutés par défaut car ils font plus que de l’analyse de code statique comme le font les autres contrôles. Ils ne sont lancés que par la commande [`migrate`](/fr/2.0/ref/django-admin/#django-admin-migrate) ou si vous indiquez l’étiquette `database`  lors de l’appel à la commande [`check`](/fr/2.0/ref/django-admin/#django-admin-check).
- `models`: contrôles régissant les définitions de modèles, champs et gestionnaires.
- `security`: contrôle la configuration liée à la sécurité.
- `signals`: contrôles des déclarations de signaux et des enregistrements de gestionnaires.
- `staticfiles`: contrôle la configuration liée à [`django.contrib.staticfiles`](/fr/2.0/ref/contrib/staticfiles/#module-django.contrib.staticfiles).
- `templates`: contrôle la configuration liée aux gabarits.
- `urls`:  contrôle la configuration des URL.

Certains contrôles peuvent être enregistrés sous plusieurs étiquettes.

## Vérifications systèmes du noyau

### Rétrocompatibilité

Les contrôles de compatibilité alertent sur des problèmes potentiels pouvant se produire après une mise à jour de Django.

- **2\_0.W001** : le motif d’URL `<pattern>` possède une route contenant `(?P<`, commençant par `^` ou se terminant par `$`. Il s’agit probablement d’un oubli lors du passage de `url()` à [`path()`](/fr/2.0/ref/urls/#django.urls.path).

### Caches

Les contrôles suivants vérifient que le réglage [`CACHES`](/fr/2.0/ref/settings/#std-setting-CACHES) est configuré correctement :

- **caches.E001** : vous devez définir un cache `'default'` dans votre réglage [`CACHES`](/fr/2.0/ref/settings/#std-setting-CACHES).

### Base de données

#### MySQL

Si vous utilisez MySQL, les contrôles suivants seront effectués :

- **mysql.E001** : MySQL ne permet pas aux champs `CharField` uniques d’avoir un attribut `max_length` \> 255.
- **mysql.W002** : le mode strict de MySQL n’est pas défini pour la connection de base de données “\<alias\>”. Voir aussi [Définition de sql\_mode](/fr/2.0/ref/databases/#mysql-sql-mode).

### Champs de modèle

- **fields.E001** : les noms de champ ne doivent pas se terminer par un trait de soulignement.
- **fields.E002** : les noms de champ ne doivent pas contenir `"__"`.
- *fields.E003\** : `pk` est un mot réservé et ne peut pas être utilisé comme nom de champ.
- **fields.E004** : `choices` doit être un élément itérable (par ex. une liste ou un tuple).
- **fields.E005** : `choices` doit être un élément itérable renvoyant des tuples `(valeur réelle, nom convivial)`.
- **fields.E006** : `db_index` ne peut contenir que `None`, `True` ou `False`.
- **fields.E007** : les clés primaires ne peuvent pas contenir `null=True`.
- **fields.E008** : tous les `validators` doivent être exécutables.
- **fields.E100** : les champs `AutoField` doivent déclarer `primary_key=True`.
- **fields.E110** : les champs `BooleanField` n’acceptent pas les valeurs nulles.
- **fields.E120** : les champs `CharField` doivent définir un attribut `max_length`.
- **fields.E121** : `max_length` doit être un entier positif.
- **fields.W122** : `max_length` est ignoré lorsqu’il est utilisé pour un champ `IntegerField`.
- **fields.E130** : les champs `DecimalField` doivent définir un attribut `decimal_places`.
- **fields.E131** : `decimal_places` doit être un entier non négatif.
- **fields.E132** : les champs `DecimalField` doivent définir un attribut `max_digits`.
- **fields.E133** : `max_digits` doit être un entier non négatif.
- **fields.E134** : `max_digits` doit être supérieur ou égal à `decimal_places`.
- **fields.E140** : les champs `FilePathField` doivent comporter l’un des deux attributs `allow_files` et `allow_folders` défini à `True`.
- **fields.E150** : les champs `GenericIPAddressField` ne peuvent pas accepter de valeurs vides si les valeurs nulles ne sont pas autorisées, car les valeurs vides sont stockées sous forme de valeurs nulles.
- **fields.E160** : les options `auto_now`, `auto_now_add` et `default` sont mutuellement exclusives. Une seule de ces options doit être conservée.
- **fields.W161** : une valeur par défaut fixe est indiquée.
- **fields.W162** : `<base_de_données>` ne prend pas en charge les index sur les colonnes `<type données champ>`.
- **fields.E900** : `IPAddressField` a été supprimé, sauf pour la prise en charge de migrations historiques.
- **fields.W900** : `IPAddressField` est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 1.9. *Ce contrôle apparaît dans Django 1.7 et 1.8*.
- **fields.W901** : `CommaSeparatedIntegerField` est obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 2.0. *Ce contrôle apparaît avec Django 1.10 et 1.11*.
- **fields.E901** : `CommaSeparatedIntegerField` a été supprimé, sauf pour la prise en charge de migrations historiques.

#### Champs de type fichier

- **fields.E200** : `unique` n’est pas un paramètre valable pour un champ `FileField`. *Ce contrôle est supprimé dans Django 1.11*.
- **fields.E201** : `primary_key` n’est pas un paramètre valable pour un champ `FileField`.
- **fields.E202** : le paramètre `upload_to` de `FileField` doit être un chemin relatif, et non absolu.
- **fields.E210** : impossible d’utiliser `ImageField` car Pillow n’est pas installé.

#### Champs de liaison

- **fields.E300** : le champ définit une relation avec le modèle `<model>`, qui n’est pas installé ou qui est abstrait.
- **fields.E301** : le champ définit une relation avec le modèle `<model>` qui a été substitué.
- **fields.E302** : l’accesseur pour le champ `<nom_de_champ>` entre en conflit avec le champ `<nom_de_champ>`.
- **fields.E303** : le nom de requête inverse pour le champ `<nom_de_champ>` entre en conflit avec le champ `<nom_de_champ>`.
- **fields.E304** : le nom du champ `<nom_de_champ>` entre en conflit avec l’accesseur de `<nom_de_champ>`.
- **fields.E305** : le nom du champ `<nom_du_champ>` entre en conflit avec nom de requête inverse pour `<nom_de_champ>`.
- **fields.E306** : le nom de liaison doit être un identifiant Python valide ou se terminer avec un `'+'`.
- **fields.E307** : le champ  `<étiquette_app>.<modèle>.<nom_de_champ>` a été déclaré avec une référence différée à `<étiquette_app>.<modèle>`, mais l’application `<étiquette_app>` n’est pas installée ou ne fournit pas de modèle `<modèle>`.
- **fields.E308** : le nom de requête inverse `<nom_requête_inverse>` ne doit pas se terminer par un soulignement.
- **fields.E309** : le nom de requête inverse `<nom_requête_inverse>` ne doit pas contenir `'__'`.
- **fields.E310** : aucun sous-ensemble des champs `<champ1>`, `<champ2>`, … du modèle `<modèle>` n’est unique. Ajoutez `unique=True` sur un de ces champs ou ajoutez au moins certains de ces champs dans une contrainte `unique_together`.
- **fields.E311** : `<modèle>` doit déclarer `unique=True` car il est référencé par une clé `ForeignKey`.
- **fields.E312** : le paramètre `to_field` `<nom_champ>` n’existe pas dans le modèle lié  \<étiquette\_app\>.\<modèle\>\`.
- **fields.E320** : le champ contient `on_delete=SET_NULL` mais il ne peut pas être nul.
- **fields.E321** : le champ contient `on_delete=SET_DEFAULT` mais il n’a pas de valeur par défaut.
- **fields.E330** : les champs `ManyToManyField` ne peuvent pas être uniques.
- **fields.E331** : le champ définit une relation plusieurs-à-plusieurs via le modèle `<modèle>` qui n’a pas été installé.
- **fields.E332** : les champs plusieurs-à-plusieurs avec des tables intermédiaires ne peuvent pas être symétriques.
- **fields.E333** : le modèle est utilisé en tant que modèle intermédiaire par `<modèle>` mais il a plus de deux clés étrangères vers `<modèle>`, ce qui est ambigu. Vous devez indiquer laquelle des deux clés étrangères Django doit utiliser via le paramètre nommé `through_fields`.
- **fields.E334** : le modèle est utilisé en tant que modèle intermédiaire par `<modèle>` mais il a plus d’une clé étrangère depuis `<modèle>`, ce qui est ambigu. Vous devez indiquer quelle clé étrangère Django doit utiliser via le paramètre nommé `through_fields`.
- **fields.E335** : le modèle est utilisé en tant que modèle intermédiaire par `<modèle>` mais il a plus d’une clé étrangère vers `<modèle>`, ce qui est ambigu. Vous devez indiquer quelle clé étrangère Django doit utiliser via le paramètre nommé `through_fields`.
- **fields.E336** : le modèle est utilisé en tant que modèle intermédiaire par `<modèle>` mais il n’a pas de clé étrangère vers `<modèle>` ou `<modèle>`.
- **fields.E337** : le champ définit `through_fields` mais ne fournit pas le nom des deux champs de liaison qui doivent être utilisés pour la relation via `<modèle>`.
- **fields.E338** : le modèle intermédiaire `<through model>` n’a pas de champ `<nom_de_champ>`.
- **fields.E339** : `<modèle>.<nom_de_champ>` n’est pas une clé étrangère vers `<modèle>`.
- **fields.E340** : la table intermédiaire du champ `<nom table>` entre en conflit avec le nom de la table de `<modèle>`/`<modèle>.<nom champ>`.
- **fields.W340** : `null` n’a pas d’effet sur le champ `ManyToManyField`.
- **fields.W341** : `ManyToManyField` ne prend pas en charge le paramètre `validators`.
- **fields.W342** : la définition de `unique=True` sur un champ `ForeignKey` a le même effet que d’utiliser un champ `OneToOneField`.
- **fields.W343** : `limit_choices_to` n’a aucun effet sur le champ `ManyToManyField` avec modèle intermédiaire.

### Modèles

- **models.E001** : `<swappable>` n’est pas sous la forme `étiquette_app.nom_app`.
- **models.E002** : `<RÉGLAGE>` fait référence à `<modèle>`, qui n’est pas installé ou qui est abstrait.
- **models.E003** : le modèle possède deux relations plusieurs-à-plusieurs via le modèle intermédiaire `<étiquette_app>.<modèle>`.
- **models.E004** : `id` ne peut être utilisé comme nom de champ que si le champ définit aussi `primary_key=True`.
- **models.E005** : le champ `<nom_de_champ>` du modèle parent `<modèle>` entre en conflit avec le champ `<nom_de_champ>` du modèle parent `<modèle>`.
- **models.E006** : le champ entre en conflit avec le champ `<nom_de_champ>` du modèle `<modèle>`.
- **models.E007** : le champ `<nom_de_champ>` a le nom de colonne `<nom_de_colonne>` qui est utilisé par un autre champ.
- **models.E008** : `index_together` doit être une liste ou un tuple.
- **models.E009** : tous les éléments de `index_together` doivent être des listes ou des tuples.
- **models.E010** : `unique_together` doit être une liste ou un tuple.
- **models.E011**: tous les éléments de `unique_together` doivent être des listes ou des tuples.
- **models.E012** : `index_together/unique_together` fait référence au champ inexistant `<nom_de_champ>`.
- **models.E013** : `index_together/unique_together` fait référence à un `<nom_de_champ>` de type `ManyToManyField`, mais ces champs ne sont pas pris en charge pour cette option.
- **models.E014** : `ordering` doit être un tuple ou une liste (même si vous souhaitez trier sur un seul champ).
- **models.E015** : `ordering` fait référence au champ inexistant `<nom_de_champ>`.
- **models.E016** : `index_together/unique_together` se réfèrent au champ `<nom_de_champ>` qui n’est pas local au modèle `<modèle>`.
- **models.E017** : le modèle mandataire `<modèle>` contient des champs de modèle.
- **models.E018** : nom de colonne auto-généré trop long pour le champ `<champ>`. La longueur maximale est de `<longueur_maximum>` pour la base de données `<alias>`.
- **models.E019** : nom de colonne auto-généré trop long pour le champ plusieurs-à-plusieurs `<champ>`. La longueur maximale est de `<longueur_maximum>` pour la base de données `<alias>`.
- **models.E020** : La méthode de classe `<modèle>.check()` est actuellement surchargée.
- **models.E021** : `ordering` et `order_with_respect_to` ne peuvent pas être utilisés simultanément.
- **models.E022** : `<fonction>` contient une référence différée à `<étiquette_app>.<modèle>`, mais l’application `<étiquette_app>` n’est pas installée ou ne fournit pas de modèle `<modèle>`.
- **models.E023** : le nom de modèle `<modèle>` ne peut pas commencer ni se terminer par un soulignement car cela entre en conflit avec la syntaxe de requête.
- **models.E024** : le nom de modèle `<modèle>` ne peut pas contenir de double soulignement car cela entre en conflit avec la syntaxe de requête.

### Sécurité

Les contrôles de sécurité ne rendent pas votre site sûr. Ils n’auditent pas votre code, ne font pas de détection d’intrusion ou quoi que ce soit d’autre de particulièrement complexe. Ils s’occupent plutôt d’une liste de contrôles automatisés détectant les problèmes les plus évidents. Ils aident à se rappeler des choses simples qui améliorent la sécurité d’un site.

Certains de ces contrôles ne sont pas forcément adéquats pour votre configuration de déploiement particulière. Par exemple, si vous avez délégué la redirection HTTP vers HTTPS à un répartiteur de charge, il serait gênant d’être constamment averti que le réglage [`SECURE_SSL_REDIRECT`](/fr/2.0/ref/settings/#std-setting-SECURE_SSL_REDIRECT) n’est pas actif. Utilisez [`SILENCED_SYSTEM_CHECKS`](/fr/2.0/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS) pour réduire au silence les contrôles non nécessaires.

Les contrôles suivants sont exécutés si l’option [`check --deploy`](/fr/2.0/ref/django-admin/#cmdoption-check-deploy) est indiquée :

- **security.W001** : l’intergiciel [`django.middleware.security.SecurityMiddleware`](/fr/2.0/ref/middleware/#django.middleware.security.SecurityMiddleware) ne figure pas dans [`MIDDLEWARE`](/fr/2.0/ref/settings/#std-setting-MIDDLEWARE) ce qui rendra ineffectif les réglages [`SECURE_HSTS_SECONDS`](/fr/2.0/ref/settings/#std-setting-SECURE_HSTS_SECONDS), [`SECURE_CONTENT_TYPE_NOSNIFF`](/fr/2.0/ref/settings/#std-setting-SECURE_CONTENT_TYPE_NOSNIFF), [`SECURE_BROWSER_XSS_FILTER`](/fr/2.0/ref/settings/#std-setting-SECURE_BROWSER_XSS_FILTER) et [`SECURE_SSL_REDIRECT`](/fr/2.0/ref/settings/#std-setting-SECURE_SSL_REDIRECT).
- **security.W002** : l’intergiciel [`django.middleware.clickjacking.XFrameOptionsMiddleware`](/fr/2.0/ref/middleware/#django.middleware.clickjacking.XFrameOptionsMiddleware) ne figure pas dans [`MIDDLEWARE`](/fr/2.0/ref/settings/#std-setting-MIDDLEWARE), ce qui fait que vos pages ne seront pas servies avec un en-tête `'x-frame-options'`. Sauf dans les cas où il existe une bonne raison pour que votre site apparaisse dans un cadre, il est recommandé d’activer cet en-tête pour contribuer à prévenir les attaques par détournement de clic.
- **security.W003** : il semble que vous n’utilisiez pas la protection intégrée de Django contre la falsification de requêtes inter-sites avec l’intergiciel dédié ([`django.middleware.csrf.CsrfViewMiddleware`](/fr/2.0/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware) ne figure pas dans [`MIDDLEWARE`](/fr/2.0/ref/settings/#std-setting-MIDDLEWARE)). L’activation de l’intergiciel est l’approche la plus sûre pour s’assurer qu’aucun trou ne subsiste dans cette protection.
- **security.W004** : vous n’avez pas défini de valeur pour le réglage [`SECURE_HSTS_SECONDS`](/fr/2.0/ref/settings/#std-setting-SECURE_HSTS_SECONDS). Si tout votre site est entièrement servi par SSL, il est possible d’envisager définir une valeur et d’activer [HSTS (HTTP Strict Transport Security)](/fr/2.0/ref/middleware/#http-strict-transport-security). Mais prenez soin de lire premièrement la documentation ; l’activation précipitée de HSTS peut être la cause de problèmes sérieux et irréversibles.
- **security.W005** : vous n’avez pas défini le réglage [`SECURE_HSTS_INCLUDE_SUBDOMAINS`](/fr/2.0/ref/settings/#std-setting-SECURE_HSTS_INCLUDE_SUBDOMAINS) à `True`. Sans cela, votre site est potentiellement vulnérable à des attaques via une connexion non sécurisée à un sous-domaine. Ne choisissez la valeur `True` que si vous êtes sûr que tous les sous-domaines de votre domaine sont exclusivement servis par SSL.
- **security.W006** : le réglage [`SECURE_CONTENT_TYPE_NOSNIFF`](/fr/2.0/ref/settings/#std-setting-SECURE_CONTENT_TYPE_NOSNIFF) n’est pas défini à `True`, ce qui fait que vos pages ne seront pas servies avec un en-tête `'x-content-type-options: nosniff'`. Vous devriez envisager d’activer cet en-tête pour empêcher les navigateurs d’identifier de manière incorrecte les types de contenu.
- **security.W007** : le réglage [`SECURE_BROWSER_XSS_FILTER`](/fr/2.0/ref/settings/#std-setting-SECURE_BROWSER_XSS_FILTER) n’est pas défini à `True`, ce qui fait que vos pages ne seront pas servies avec un en-tête `'x-xss-protection: 1; mode=block'`. Vous devriez envisager d’activer cet en-tête pour activer le filtrage XSS des navigateurs et aider ainsi à prévenir les attaques XSS.
- **security.W008** : le réglage [`SECURE_SSL_REDIRECT`](/fr/2.0/ref/settings/#std-setting-SECURE_SSL_REDIRECT) n’est pas défini à `True`. Sauf si votre site doit être accessible à la fois par des connexions SSL et non SSL, il est conseillé de soit définir ce réglage à `True`, soit de configurer un répartiteur de charge ou un serveur mandataire inverse pour rediriger toutes les connexions vers HTTPS.
- **security.W009** : la clé secrète [`SECRET_KEY`](/fr/2.0/ref/settings/#std-setting-SECRET_KEY) contient moins de 50 caractères ou possède moins de 5 caractères différents. Veuillez générer une clé secrète longue et aléatoire, faute de quoi de nombreuses fonctionnalités de Django liées à la sécurité seront vulnérables aux attaques.
- **security.W010** : l’application [`django.contrib.sessions`](/fr/2.0/topics/http/sessions/#module-django.contrib.sessions) se trouve dans votre réglage [`INSTALLED_APPS`](/fr/2.0/ref/settings/#std-setting-INSTALLED_APPS) mais vous n’avez pas défini [`SESSION_COOKIE_SECURE`](/fr/2.0/ref/settings/#std-setting-SESSION_COOKIE_SECURE) à `True`. L’utilisation d’un cookie de session sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de s’immiscer dans les sessions des utilisateurs.
- **security.W011** : [`django.contrib.sessions.middleware.SessionMiddleware`](/fr/2.0/ref/middleware/#django.contrib.sessions.middleware.SessionMiddleware) figure dans [`MIDDLEWARE`](/fr/2.0/ref/settings/#std-setting-MIDDLEWARE), mais vous n’avez pas défini [`SESSION_COOKIE_SECURE`](/fr/2.0/ref/settings/#std-setting-SESSION_COOKIE_SECURE) à `True`. L’utilisation d’un cookie de session sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de s’immiscer dans les sessions des utilisateurs.
- **security.W012** : [`SESSION_COOKIE_SECURE`](/fr/2.0/ref/settings/#std-setting-SESSION_COOKIE_SECURE) n’est pas défini à `True`. L’utilisation d’un cookie de session sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de s’immiscer dans les sessions des utilisateurs.
- **security.W013** : l’application [`django.contrib.sessions`](/fr/2.0/topics/http/sessions/#module-django.contrib.sessions) se trouve dans votre réglage [`INSTALLED_APPS`](/fr/2.0/ref/settings/#std-setting-INSTALLED_APPS) mais vous n’avez pas défini [`SESSION_COOKIE_HTTPONLY`](/fr/2.0/ref/settings/#std-setting-SESSION_COOKIE_HTTPONLY) à `True`. L’utilisation d’un cookie de session `HttpOnly` complique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.
- **security.W014** : [`django.contrib.sessions.middleware.SessionMiddleware`](/fr/2.0/ref/middleware/#django.contrib.sessions.middleware.SessionMiddleware) figure dans [`MIDDLEWARE`](/fr/2.0/ref/settings/#std-setting-MIDDLEWARE), mais vous n’avez pas défini [`SESSION_COOKIE_HTTPONLY`](/fr/2.0/ref/settings/#std-setting-SESSION_COOKIE_HTTPONLY) à `True`. L’utilisation d’un cookie de session `HttpOnly` complique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.
- **security.W015** : [`SESSION_COOKIE_HTTPONLY`](/fr/2.0/ref/settings/#std-setting-SESSION_COOKIE_HTTPONLY) n’est pas défini à `True`. L’utilisation d’un cookie de session `HttpOnly` complique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.
- **security.W016** : [`CSRF_COOKIE_SECURE`](/fr/2.0/ref/settings/#std-setting-CSRF_COOKIE_SECURE) n’est pas défini à `True`. L’utilisation d’un cookie CSRF sécurisé complique la tâche des renifleurs de trafic réseau quand ils essaient de voler le jeton CSRF.
- **security.W017** : [`CSRF_COOKIE_HTTPONLY`](/fr/2.0/ref/settings/#std-setting-CSRF_COOKIE_HTTPONLY) n’est pas défini à `True`. L’utilisation d’un cookie CSRF `HttpOnly` complique la tâche des attaques par script inter-site quand elles essaient de voler le jeton CSRF. *Ce contrôle est supprimé dans Django 1.11 car le réglage* [`CSRF_COOKIE_HTTPONLY`](/fr/2.0/ref/settings/#std-setting-CSRF_COOKIE_HTTPONLY) *n’offre aucun bénéfice concret.*
- **security.W018** : le réglage [`DEBUG`](/fr/2.0/ref/settings/#std-setting-DEBUG) ne devrait pas être défini à `True` pour une application Django déployée.
- **security.W019** : [`django.middleware.clickjacking.XFrameOptionsMiddleware`](/fr/2.0/ref/middleware/#django.middleware.clickjacking.XFrameOptionsMiddleware) figure dans [`MIDDLEWARE`](/fr/2.0/ref/settings/#std-setting-MIDDLEWARE), mais [`X_FRAME_OPTIONS`](/fr/2.0/ref/settings/#std-setting-X_FRAME_OPTIONS) n’est pas défini à `'DENY'`. La valeur par défaut est `'SAMEORIGIN'`, mais sauf dans les cas où un site a une bonne raison de servir certaines de ses parties dans un cadre, vous devriez modifier ce réglage à `'DENY'`.
- **security.W020** : le réglage [`ALLOWED_HOSTS`](/fr/2.0/ref/settings/#std-setting-ALLOWED_HOSTS) ne peut pas être vide en déploiement.
- **security.W021** : vous n’avez pas défini le réglage [`SECURE_HSTS_PRELOAD`](/fr/2.0/ref/settings/#std-setting-SECURE_HSTS_PRELOAD) à `True`. Sans cela, votre site ne peut pas être proposé à la liste de préchargement des navigateurs.

### Signaux

- **signals.E001** : `<gestionnaire>` est connecté au signal `<signal>` avec une référence différée vers l’expéditeur `<étiquette app>.<modèle>`, mais `<étiquette app>` n’est pas installé ou ne fournit pas le modèle `<modèle>`.

### Gabarits

Les contrôles suivants vérifient que le réglage [`TEMPLATES`](/fr/2.0/ref/settings/#std-setting-TEMPLATES) est configuré correctement :

- **templates.E001** : `'APP_DIRS': True` figure dans votre réglage [`TEMPLATES`](/fr/2.0/ref/settings/#std-setting-TEMPLATES) mais `'loaders'` est aussi dans `OPTIONS`. Supprimez `APP_DIRS` ou l’option `'loaders'`.
- **templates.E002** : `string_if_invalid` dans [`TEMPLATES`](/fr/2.0/ref/settings/#std-setting-TEMPLATES) [`OPTIONS`](/fr/2.0/ref/settings/#std-setting-TEMPLATES-OPTIONS) doit être une chaîne, mais c’est actuellement : `{valeur}` (`{type}`).

### URL

Les contrôles suivants sont effectués sur votre configuration d’URL :

- **urls.W001** : le motif d’URL `<pattern>` utilise [`include()`](/fr/2.0/ref/urls/#django.urls.include) avec une expression `route` se terminant par `$`. Enlevez le dollar de l’expression `route` pour éviter des problèmes lors de l’inclusion d’URL.
- **urls.W002** : le motif d’URL `<pattern>` possède une expression `route` commençant par `/`. Enlevez cette barre oblique car elle n’est pas nécessaire. Si ce motif est référencé par un [`include()`](/fr/2.0/ref/urls/#django.urls.include), vérifiez que le motif [`include()`](/fr/2.0/ref/urls/#django.urls.include) se termine par `/`.
- **urls.W003** : le motif d’URL `<pattern>` possède un nom `name` contenant un `:`. Enlevez ces deux-points pour éviter des références d’espaces de noms ambigus.
- **urls.E004** : le motif d’URL `<motif>` n’est pas valide. Vérifiez que `urlpatterns` est bien une liste d’instances [`path()`](/fr/2.0/ref/urls/#django.urls.path) ou [`re_path()`](/fr/2.0/ref/urls/#django.urls.re_path).
- **urls.W005** : l’espace de noms d’URL `<espace de nom>` n’est pas unique. Il est possible que certains URL de cet espace de noms ne puissent pas être résolus.
- **urls.E006** : les réglages [`MEDIA_URL`](/fr/2.0/ref/settings/#std-setting-MEDIA_URL)/ [`STATIC_URL`](/fr/2.0/ref/settings/#std-setting-STATIC_URL) doivent se terminer par une barre oblique.

## Contrôles des applications `contrib`

### `admin`

Les contrôles de l’interface d’administration sont tous effectués sous l’étiquette `admin`.

Les contrôles suivants sont effectués sur toute classe (ou sous-classe de) [`ModelAdmin`](/fr/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin) qui est inscrite auprès du site d’administration :

- **admin.E001** : la valeur de `raw_id_fields` doit être une liste ou un tuple.
- **admin.E002** : la valeur de `raw_id_fields[n]` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E003** : la valeur de `raw_id_fields[n]` doit être une clé étrangère ou un champ plusieurs-à-plusieurs.
- **admin.E004** : la valeur de `fields` doit être une liste ou un tuple.
- **admin.E005** : `fieldsets` et `fields` sont tous deux spécifiés.
- **admin.E006** : la valeur de `fields` contient des champs en double.
- **admin.E007** : la valeur de `fieldsets` doit être une liste ou un tuple.
- **admin.E008** : la valeur de `fieldsets[n]` doit être une liste ou un tuple.
- **admin.E009** : la valeur de `fieldsets[n]` doit être de longueur 2.
- **admin.E010** : la valeur de `fieldsets[n][1]` doit être un dictionnaire.
- **admin.E011** : la valeur de `fieldsets[n][1]` doit contenir la clé `fields`.
- **admin.E012** : il y a des champs en double dans `fieldsets[n][1]`.
- **admin.E013** : `fields[n]/fieldsets[n][m]` ne peut pas inclure le champ `ManyToManyField` `<nom_de_champ>`, car ce champ définit manuellement un modèle de relation.
- **admin.E014** : la valeur de `exclude` doit être une liste ou un tuple.
- **admin.E015** : la valeur de `exclude` contient des champs en double.
- **admin.E016** : la valeur de `form` doit hériter de `BaseModelForm`.
- **admin.E017** : la valeur de `filter_vertical` doit être une liste ou un tuple.
- **admin.E018** : la valeur de `filter_horizontal` doit être une liste ou un tuple.
- **admin.E019** : la valeur de `filter_vertical[n]/filter_vertical[n]` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E020** : la valeur de `filter_vertical[n]/filter_vertical[n]` doit être un champ plusieurs-à-plusieurs.
- **admin.E021** : la valeur de `radio_fields` doit être un dictionnaire.
- **admin.E022** : la valeur de `radio_fields` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E023** : la valeur de `radio_fields` fait référence à `<nom_de_champ>`, qui n’est pas une clé `ForeignKey` et n’a pas de définition `choices`.
- **admin.E024** : la valeur de `radio_fields[<nom_de_champ>]` doit être soit `admin.HORIZONTAL` soit `admin.VERTICAL`.
- **admin.E025** : la valeur de `view_on_site` doit être soit un objet exécutable, soit une valeur booléenne.
- **admin.E026** : la valeur de `prepopulated_fields` doit être un dictionnaire.
- **admin.E027** : la valeur de `prepopulated_fields` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E028** : la valeur de `prepopulated_fields` fait référence à `<nom_de_champ>`, qui ne doit pas être un champ `DateTimeField`, `ForeignKey`, `OneToOneField` ni `ManyToManyField`.
- **admin.E029** : la valeur de `prepopulated_fields[<nom_de_champ>]` doit être une liste ou un tuple.
- **admin.E030** : la valeur de `prepopulated_fields` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E031** : la valeur de `ordering` doit être une liste ou un tuple.
- **admin.E032** : la valeur de `ordering` a le marqueur d’ordre aléatoire `?`, mais contient aussi d’autres champs.
- **admin.E033** : la valeur de `ordering` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E034** : la valeur de `readonly_fields` doit être une liste ou un tuple.
- **admin.E035**: La valeur de `readonly_fields[n]` n’est pas appelable, un attribut de `<ModelAdmin class>`, ou un attribut de `<model>`.
- **admin.E036** : la valeur de `autocomplete_fields` doit être une liste ou un tuple.
- **admin.E037** : la valeur de `autocomplete_fields[n]` fait référence à `<nom_de_champ>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E038** : la valeur de `autocomplete_fields[n]` doit être une clé étrangère ou un champ plusieurs-à-plusieurs.
- **admin.E039** : une classe admin du modèle `<modèle>` doit être inscrite pour être référencée par `<modeladmin>.autocomplete_fields`.
- **admin.E040** : `<modeladmin>` doit définir `search_fields` car il est référencé par `<autre_modeladmin>.autocomplete_fields` .

#### `ModelAdmin`

Les contrôles suivants sont effectués sur toute classes (ou sous-classe de) [`ModelAdmin`](/fr/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin) qui est enregistrée auprès du site d’administration:

- **admin.E101**: La valeur de `save_as` doit être un booléen.
- **admin.E102**: La valeur de `save_on_top` doit être un booléen.
- **admin.E103**: La valeur de `inlines` doit être une liste ou un tuple.
- **admin.E104** : `<InlineModelAdmin class>` doit hériter de `InlineModelAdmin`.
- **admin.E105**: `<InlineModelAdmin class>` doit avoir un attribut `model`.
- **admin.E106**: La valeur de `<InlineModelAdmin class>.model` doit être un `Model`.
- **admin.E107**: La valeur de `list_display` doit être une liste ou un tuple.
- **admin.E108** : la valeur de `list_display[n]` fait référence à `<label>`, qui n’est pas un objet exécutable, un attribut de `<classe ModelAdmin>`, ni un attribut ou une méthode de `<modèle>`.
- **admin.E109** : la valeur de `list_display[n]` ne peut pas être un champ `ManyToManyField`.
- **admin.E110** : La valeur de `list_display_links` doit être une liste, un tuple ou `None`.
- **admin.E111** : la valeur de `list_display_links[n]` fait référence à `<label>`, qui n’est pas défini dans `list_display`.
- **admin.E112** : La valeur de `list_filter` doit être une liste ou un tuple.
- **admin.E113** : la valeur de `list_filter[n]` doit hériter de `ListFilter`.
- **admin.E114** : la valeur de `list_filter[n]` ne doit pas hériter de `FieldListFilter`.
- **admin.E115** : la valeur de `list_filter[n][1]` doit hériter de `FieldListFilter`.
- **admin.E116** : la valeur de `list_filter[n]` fait référence à `<label>`, qui ne fait pas référence à un champ `Field`.
- **admin.E117** : la valeur de `list_select_related` doit être une valeur booléenne, un tuple ou une liste.
- **admin.E118** : la valeur de `list_per_page` doit être un nombre entier.
- **admin.E119** : la valeur de `list_max_show_all` doit être un nombre entier.
- **admin.E120** : la valeur de `list_editable` doit être une liste ou un tuple.
- **admin.E121** : la valeur de `list_editable[n]` fait référence à `<label>`, qui n’est pas un attribut de `<modèle>`.
- **admin.E122** : la valeur de `list_editable[n]` fait référence à `<label>`, qui ne figure pas dans `list_display`.
- **admin.E123** : la valeur de `list_editable[n]` ne peut pas être à la fois dans `list_editable` et dans  `list_display_links`.
- **admin.E124** : la valeur de `list_editable[n]` fait référence au tout premier champ dans `list_display` (`<label>`), qui ne peut pas utilisé tant que `list_display_links` n’est pas défini.
- **admin.E125** : la valeur de `list_editable[n]` fait référence à `<nom_de_champ>`, qui n’est pas modifiable dans l’interface d’administration.
- **admin.E126** : La valeur de `search_fields` doit être une liste ou un tuple.
- **admin.E127** : la valeur de `date_hierarchy` fait référence à `<nom_de_champ>`, qui ne se réfère pas à un champ.
- **admin.E128** : la valeur de `date_hierarchy` doit être un champ `DateField` ou `DateTimeField`.

#### `InlineModelAdmin`

Les contrôles suivants sont effectués sur chaque [`InlineModelAdmin`](/fr/2.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin) qui est inscrit comme élément intégré dans une classe [`ModelAdmin`](/fr/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin).

- **admin.E201** : vous ne pouvez pas exclure le champ `<nom_de_champ>`, car il s’agit de la clé étrangère vers le modèle parent `<étiquette_application>.<modèle>`.
- **admin.E202** : `<modèle>` n’a pas de clé `ForeignKey` vers `<modèle parent>`./ ```<modèle> `` a plus d'une clé ``ForeignKey``` vers `<modèle parent>`.
- **admin.E203** : la valeur de `extra` doit être un nombre entier.
- **admin.E204** : la valeur de `max_num` doit être un nombre entier.
- **admin.E205** : la valeur de `min_num` doit être un nombre entier.
- **admin.E206** : la valeur de `formset` doit hériter de `BaseModelFormSet`.

#### `GenericInlineModelAdmin`

Les contrôles suivants sont effectués sur chaque [`GenericInlineModelAdmin`](/fr/2.0/ref/contrib/contenttypes/#django.contrib.contenttypes.admin.GenericInlineModelAdmin) qui est inscrit comme élément intégré dans une classe [`ModelAdmin`](/fr/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin).

- **admin.E301** : `'champ_ct'` fait référence à `<label>`, qui n’est pas un champ de `<modèle>`.
- **admin.E302** : `'champ_ct_fk'` fait référence à `<label>`, qui n’est pas un champ de `<modèle>`.
- **admin.E303** : `<modèle>` n’a pas de clé `GenericForeignKey`.
- **admin.E304** : `<modèle>` n’a pas de clé `GenericForeignKey` utilisant le champ de type de contenu `<nom_de_champ>` et le champ d’identifiant d’objet `<nom_de_champ>`.

#### `AdminSite`

Les contrôles suivants sont effectués sur l’objet [`AdminSite`](/fr/2.0/ref/contrib/admin/#django.contrib.admin.AdminSite) par défaut :

- **admin.E401** : [`django.contrib.contenttypes`](/fr/2.0/ref/contrib/contenttypes/#module-django.contrib.contenttypes) doit être dans [`INSTALLED_APPS`](/fr/2.0/ref/settings/#std-setting-INSTALLED_APPS) pour pouvoir utiliser l’application d’administration.
- **admin.E402** : [`django.contrib.auth.context_processors.auth`](/fr/2.0/ref/templates/api/#django.contrib.auth.context_processors.auth) doit être dans [`TEMPLATES`](/fr/2.0/ref/settings/#std-setting-TEMPLATES) pour pouvoir utiliser l’application d’administration.

### `auth`

- **auth.E001** : `REQUIRED_FIELDS` doit être une liste ou un tuple.
- **auth.E002** : le champ désigné en tant que `USERNAME_FIELD` pour un modèle utilisateur personnalisé ne doit pas être inclus dans `REQUIRED_FIELDS`.
- **auth.E003** : `<champ>` doit être unique car il est désigné comme `USERNAME_FIELD`.
- **auth.W004** : `<champ>` est désigné comme `USERNAME_FIELD`, mais il n’est pas unique.
- **auth.E005** : le nom de code de permission `<nom_code>` entre en conflit avec une permission intégrée du modèle `<modèle>`.
- **auth.E006** : le nom de code de permission `<nom_code>` est à double pour le modèle `<modèle>`.
- **auth.E007** : l’attribut [`verbose_name`](/fr/2.0/ref/models/options/#django.db.models.Options.verbose_name) du modèle `<modèle>` ne doit pas dépasser 244 caractères pour que ses noms de permissions automatiques ne dépassent pas 255 caractères.
- **auth.E008** : la permission nommée `<nom>` du modèle `<modèle>` est plus longue que 255 caractères.
- **auth.C009** : `<modèle utilisateur>.is_anonymous` doit être un attribut ou une propriété plutôt qu’une méthode. Il s’agit d’un problème de sécurité car avec une méthode, les utilisateurs anonymes seront considérés comme authentifiés !
- **auth.C010** : `<modèle utilisateur>.is_authenticated` doit être un attribut ou une propriété plutôt qu’une méthode. Il s’agit d’un problème de sécurité car avec une méthode, les utilisateurs anonymes seront considérés comme authentifiés !

### `contenttypes`

Les contrôles suivants sont effectués quand un modèle contient une clé [`GenericForeignKey`](/fr/2.0/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey) ou une relation [`GenericRelation`](/fr/2.0/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericRelation):

- **contenttypes.E001** : l’ID d’objet `GenericForeignKey` fait référence au champ `<field>` qui n’existe pas.
- **contenttypes.E002** : le type de contenu `GenericForeignKey` fait référence au champ `<field>` inexistant.
- **contenttypes.E003** : `<champ>` n’est pas une clé `ForeignKey`.
- **contenttypes.E004** : `<field>` n’est pas une `ForeignKey` vers `contenttypes.ContentType`.
- **contenttypes.E005** : les noms de modèles ne peuvent pas dépasser 100 caractères.

### `sites`

Les contrôles suivants sont effectués sur chaque modèle utilisant un gestionnaire [`CurrentSiteManager`](/fr/2.0/ref/contrib/sites/#django.contrib.sites.managers.CurrentSiteManager):

- **sites.E001** : `CurrentSiteManager` n’a pas réussi à trouver un champ nommé `<nom_de_champ>`.
- **sites.E002** : `CurrentSiteManager` ne peut pas utiliser `<champ>` car ce n’est pas une clé étrangère ni un champ plusieurs-à-plusieurs.

### `staticfiles`

Les contrôles suivants vérifient que [`django.contrib.staticfiles`](/fr/2.0/ref/contrib/staticfiles/#module-django.contrib.staticfiles) est configuré correctement :

- **staticfiles.E001** : le réglage [`STATICFILES_DIRS`](/fr/2.0/ref/settings/#std-setting-STATICFILES_DIRS) n’est pas un tuple ni une liste.
- **staticfiles.E002** : le réglage [`STATICFILES_DIRS`](/fr/2.0/ref/settings/#std-setting-STATICFILES_DIRS) ne doit pas contenir le réglage [`STATIC_ROOT`](/fr/2.0/ref/settings/#std-setting-STATIC_ROOT).
