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.
Référence de l’API¶
CheckMessage¶
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 :
levelLa 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.msgUne courte chaĂ®ne (moins de 80 caractères) dĂ©crivant le problème. La chaĂ®ne ne doit pas contenir des sauts de ligne.
hintUne 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
Nonepeut être utilisée.objFacultatif. 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.idChaîne facultative. Un identifiant unique pour le problème. Les identifiants doivent suivre le modèle
applabel.X001, oùXest l’une des lettresCEWID, indiquant la gravité du message (Cpour critique,Epour 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.
Vérifications systèmes du noyau¶
Gestion du code asynchrone¶
Les contrôles suivants vérifient votre configuration concernant Gestion du code asynchrone:
async.E001 : vous ne devez pas définir la variable d’environnement envvar:DJANGO_ALLOW_ASYNC_UNSAFE en déploiement. Cela désactive la protection de sécurité async.
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 deurl()Ăpath().4_0.E001: Ă partir de Django 4.0, les valeurs du rĂ©glage
CSRF_TRUSTED_ORIGINSdoivent commencer par un protocole (généralement http://` ouhttps://), mais<nom_hôte>a été trouvé.
Caches¶
Les contrôles suivants vérifient que le réglage CACHES est configuré correctement :
caches.E001 : vous devez définir un cache
'default'dans votre réglageCACHES.caches.W002 : votre configuration de
<cache>peut exposer votre cache ou permettre une corruption de vos données car son emplacementLOCATIONcorrespond à , ou se trouve dans un des réglagesMEDIA_ROOT/STATIC_ROOT/STATICFILES_DIRS.caches.W003 : l’emplacement
LOCATIONdu<cache>est relatif. Utilisez plutĂ´t un chemin absolu.
Base de données¶
MySQL et MariaDB¶
Si vous utilisez MySQL ou MariaDB, les contrôles suivants seront effectués :
mysql.E001Â : MySQL/MariaDB ne permet pas aux champs
CharFielduniques d’avoir un attributmax_length> 255. Ce contrôle a été transformé enmysql.W003dans Django 3.1 car la taille maximale réelle dépend de plusieurs facteurs.mysql.W002 : le mode strict de MySQL/MariaDB n’est pas défini pour la connexion de base de données
<alias>. Voir aussi Définition de sql_mode.mysql.W003 : MySQL/MariaDB pourrait ne pas permettre aux champs
CharFielduniques d’avoir un attributmax_length> 255.
Gestion des fichiers¶
Les contrôles suivants vérifient votre configuration concernant Gestion des fichiers:
files.E001 : le réglage
FILE_UPLOAD_TEMP_DIRse réfère au répertoire inexistant<path>.
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*Â :
pkest un mot réservé et ne peut pas être utilisé comme nom de champ.fields.E004 :
choicesdoit être une table de correspondance (par ex. un dictionnaire) ou un élément itérable (par ex. une liste ou un tuple).fields.E005 :
choicesdoit être une table faisant correspondre des valeurs réelles à des noms humainement lisibles ou un élément itérable contenant des tuples(valeur réelle, nom convivial).fields.E006 :
db_indexne peut contenir queNone,TrueouFalse.fields.E007 : les clés primaires ne peuvent pas contenir
null=True.fields.E008 : tous les
validatorsdoivent être exécutables.fields.E009 :
max_lengthest trop court pour accueillir la plus longue valeur dechoices(<count>caractères).fields.E010 : la valeur par défaut de
<champ>doit être un objet exécutable plutôt qu’une instance afin qu’elle ne soit pas partagée entre toutes les instances de ce champ.fields.E011 :
<base_de_données>ne prend pas en charge les valeurs par défaut en base de données contenant des expressions (db_default).fields.E012:
<expression>ne peut pas être utilisée dansdb_default.fields.E013 :
CompositePrimaryKeydoit être nomméepk.fields.E100 : les champs
AutoFielddoivent déclarerprimary_key=True.fields.E110 : les champs
BooleanFieldn’acceptent pas les valeurs nulles. Ce contrôle est apparu avant la prise en charge des valeurs nulles ajoutée dans Django 2.1.fields.E120 : les champs
CharFielddoivent définir un attributmax_length.fields.E121 :
max_lengthdoit ĂŞtre un entier positif.fields.W122Â :
max_lengthest ignoré lorsqu’il est utilisé pour un champ<type de champ entier>.fields.E130 : les champs
DecimalFielddoivent définir un attributdecimal_places.fields.E131 :
decimal_placesdoit être un entier non négatif.fields.E132 : les champs
DecimalFielddoivent définir un attributmax_digits.fields.E133 :
max_digitsdoit ĂŞtre un entier positif.fields.E134Â :
max_digitsdoit ĂŞtre supĂ©rieur ou Ă©gal Ădecimal_places.fields.E140 : les champs
FilePathFielddoivent comporter l’un des deux attributsallow_filesetallow_foldersdĂ©fini ĂTrue.fields.E150 : les champs
GenericIPAddressFieldne peuvent avoirblank=Truesinull=False, car les valeurs vides sont stockées sous forme de valeurs nulles.fields.E160 : les options
auto_now,auto_now_addetdefaultsont 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.W163:
<base_de_données>ne gère pas les commentaires sur les colonnes (db_comment).fields.E170 : la valeur par défaut de
BinaryFieldne peut pas être une chaîne. Utilisez plutôt un contenu binaire.fields.E180 :
<base de données>ne prend pas en charge les champsJSONField.fields.E190 :
<base_de_données>ne prend pas en charge les collations sur les colonnes<field_type>.fields.E220 :
<base de données>ne prend pas en charge les champsGeneratedField.fields.E221 :
<base de données>ne prend pas en charge les champsGeneratedFieldnon persistants.fields.E222 :
<base de données>ne prend pas en charge les champsGeneratedFieldpersistants.fields.E223 :
GeneratedField.output_fieldcontient des erreurs : …fields.W224 :
GeneratedField.output_fieldcontient des avertissements : …fields.E900 :
IPAddressFielda été supprimé, sauf pour la prise en charge de migrations historiques.fields.W900 :
IPAddressFieldest 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 :
CommaSeparatedIntegerFieldest 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 :
CommaSeparatedIntegerFielda été supprimé, sauf pour la prise en charge de migrations historiques.fields.W902:
FloatRangeFieldest obsolète et sera supprimé dans Django 3.1. Ce contrôle est apparu dans Django 2.2 et 3.0.fields.W903 :
NullBooleanFieldest obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 4.0. Ce contrôle apparaît dans Django 3.1 et 3.2.fields.E903 :
NullBooleanFielda été supprimé, sauf pour la prise en charge de migrations historiques.fields.W904 :
django.contrib.postgres.fields.JSONFieldest obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 4.0. Ce contrôle apparaît dans Django 3.1 et 3.2.fields.E904 :
django.contrib.postgres.fields.JSONFielda été supprimé, sauf pour la prise en charge de migrations historiques.fields.W905 :
django.contrib.postgres.fields.CICharFieldest obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 5.1. Ce contrôle apparaît dans Django 4.2 et 5.0.fields.E905 :
django.contrib.postgres.fields.CICharFielda été supprimé, sauf pour la prise en charge de migrations historiques.fields.W906 :
django.contrib.postgres.fields.CIEmailFieldest obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 5.1. Ce contrôle apparaît dans Django 4.2 et 5.0.fields.E906 :
django.contrib.postgres.fields.CIEmailFielda été supprimé, sauf pour la prise en charge de migrations historiques.fields.W907 :
django.contrib.postgres.fields.CITextFieldest obsolète. Sa prise en charge (à l’exception des migrations historiques) sera supprimée dans Django 5.1. Ce contrôle apparaît dans Django 4.2 et 5.0.fields.E907 :
django.contrib.postgres.fields.CITextFielda été supprimé, sauf pour la prise en charge de migrations historiques.
Champs de type fichier¶
fields.E200Â :
uniquen’est pas un paramètre valable pour un champFileField. Ce contrôle est supprimé dans Django 1.11.fields.E201 :
primary_keyn’est pas un paramètre valable pour un champFileField.fields.E202 : le paramètre
upload_todeFileFielddoit être un chemin relatif, et non absolu.fields.E210 : impossible d’utiliser
ImageFieldcar Pillow n’est pas installé.
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 identiques via le modèle intermĂ©diaire
<étiquette_app>.<modèle>.models.E004 :
idne peut être utilisé comme nom de champ que si le champ définit aussiprimary_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
<nom_de_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_togetherdoit être une liste ou un tuple. Ce contrôle est apparu avant Django 5.1.models.E009 : tous les éléments de
index_togetherdoivent ĂŞtre des listes ou des tuples. Ce contrĂ´le est apparu avant Django 5.1.models.E010Â :
unique_togetherdoit être une liste ou un tuple.models.E011: tous les éléments de
unique_togetherdoivent ĂŞtre des listes ou des tuples.models.E012 :
contrainte/index/unique_togetherfait référence au champ inexistant<nom_de_champ>.models.E013 :
contrainte/index/unique_togetherfait référence à un<nom_de_champ>de typeManyToManyField, mais ces champs ne sont pas pris en charge pour cette option.models.E014 :
orderingdoit ĂŞtre un tuple ou une liste (mĂŞme si vous souhaitez trier sur un seul champ).models.E015 :
orderingfait référence au champ, champ lié ou recherche inexistant<nom_de_champ>.models.E016 :
contrainte/index/unique_togetherse 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 :
orderingetorder_with_respect_tone 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.fields.E025 : la propriété
<nom_de_propriété>entre en conflit avec un accesseur de champ lié.models.E026 : le modèle ne peut avoir plus d’un champ avec
primary_key=True.models.W027:
<base de données>ne prend pas en charge les contraintes de vérification.models.E028:
db_table<table_bd>est utilisée par plusieurs modèles :<liste de modèles>.models.E029 : le nom d’index
<index>n’est pas unique pour le modèle<modèle>.models.E030 : le nom d’index
<index>n’est pas unique parmi les modèles :<liste_modèles>.models.E031 : le nom de contrainte
<contrainte>n’est pas unique pour le modèle<modèle>.models.E032 : le nom de contrainte
<contrainte>n’est pas unique parmi les modèles<liste_modèles>.models.E033 : le nom d’index
<index>ne peut pas commencer par un soulignement, ni par un nombre.models.E034 : le nom d’index
<index>ne peut pas dépasser<max_length>caractères.models.W035:
db_table<table_bd>est utilisée par plusieurs modèles :<liste de modèles>.models.W036:
<base de données>ne prend pas en charge les contraintes d’unicité avec conditions.models.W037:
<base de données>ne prend pas en charge les index avec conditions.models.W038:
<base de données>ne prend pas en charge les contraintes d’unicité différables.models.W039:
<base de données>ne prend pas en charge les contraintes d’unicité avec des colonnes qui ne sont pas des clés.models.W040:
<base de données>ne prend pas en charge les index avec des colonnes qui ne sont pas des clés.models.E041 :
constraintsfait référence au champ joint<nom_de_champ>.models.E042 :
<field name>ne peut pas faire partie de la clé primaire composite.models.W042 : clé primaire créée automatiquement sans qu’un type de clé primaire ne soit défini, par défaut
django.db.models.AutoField.models.W043:
<base de données>ne prend pas en charge les index sur les expressions.models.W044:
<base de données>ne prend pas en charge les contraintes d’unicité avec les expressions.models.W045 : la contrainte d’intégrité
<contrainte>contient une expressionRawSQL()et ne sera pas validée dans la méthodefull_clean()du modèle.models.W046 :
<database>ne prend pas en charge les commentaires sur les tables (db_table_comment).models.W047Â :
<base de données>ne prend pas en charge les contraintes d’unicité avec nuls distincts.models.E048 :
constraints/indexes/unique_togetherfait référence à une cléCompositePrimaryKey<field name>, mais les clésCompositePrimaryKeyne sont pas autorisées pour cette option.
Commandes d’administration¶
Les contrôles suivants vérifient que les commandes d’administration personnalisées sont correctement configurées :
commands.E001Â : les commandes
migrateetmakemigrationsdoivent posséder la même valeurautodetector.
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 qui peuvent vous aider à améliorer 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 n’est pas actif. Utilisez 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 est indiquée :
security.W001 : l’intergiciel
django.middleware.security.SecurityMiddlewarene figure pas dansMIDDLEWAREce qui rendra ineffectif les réglagesSECURE_HSTS_SECONDS,SECURE_CONTENT_TYPE_NOSNIFF,SECURE_REFERRER_POLICY,SECURE_CROSS_ORIGIN_OPENER_POLICYetSECURE_SSL_REDIRECT.security.W002 : l’intergiciel
django.middleware.clickjacking.XFrameOptionsMiddlewarene figure pas dansMIDDLEWARE, 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.CsrfViewMiddlewarene figure pas dansMIDDLEWARE). 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. 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). 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ĂTrue. Sans cela, votre site est potentiellement vulnĂ©rable Ă des attaques via une connexion non sĂ©curisĂ©e Ă un sous-domaine. Ne choisissez la valeurTrueque 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_NOSNIFFn’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_FILTERn’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. Ce contrĂ´le a Ă©tĂ© supprimĂ© dans Django 3.0 car l’en-tĂŞteX-XSS-Protectionn’est plus pris en compte par les navigateurs modernes.security.W008 : le rĂ©glage
SECURE_SSL_REDIRECTn’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_KEYcontient moins de 50 caractères, moins de 5 caractères différents ou est préfixée par'django-insecure-', ce qui indique qu’elle a été générée automatiquement par Django. Veuillez générer une valeur 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.sessionsse trouve dans votre rĂ©glageINSTALLED_APPSmais vous n’avez pas dĂ©finiSESSION_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.SessionMiddlewarefigure dansMIDDLEWARE, mais vous n’avez pas dĂ©finiSESSION_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_SECUREn’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.sessionsse trouve dans votre rĂ©glageINSTALLED_APPSmais vous n’avez pas dĂ©finiSESSION_COOKIE_HTTPONLYĂTrue. L’utilisation d’un cookie de sessionHttpOnlycomplique 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.SessionMiddlewarefigure dansMIDDLEWARE, mais vous n’avez pas dĂ©finiSESSION_COOKIE_HTTPONLYĂTrue. L’utilisation d’un cookie de sessionHttpOnlycomplique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.security.W015 :
SESSION_COOKIE_HTTPONLYn’est pas dĂ©fini ĂTrue. L’utilisation d’un cookie de sessionHttpOnlycomplique la tâche des attaques par script inter-site quand elles essaient de s’immiscer dans les sessions des utilisateurs.security.W016 :
CSRF_COOKIE_SECUREn’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_HTTPONLYn’est pas dĂ©fini ĂTrue. L’utilisation d’un cookie CSRFHttpOnlycomplique 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Ă©glageCSRF_COOKIE_HTTPONLYn’offre aucun bĂ©nĂ©fice concret.security.W018 : le rĂ©glage
DEBUGne devrait pas ĂŞtre dĂ©fini ĂTruepour une application Django dĂ©ployĂ©e.security.W019 :
django.middleware.clickjacking.XFrameOptionsMiddlewarefigure dansMIDDLEWARE, maisX_FRAME_OPTIONSn’est pas dĂ©fini Ă'DENY'. 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_HOSTSne peut pas être vide en déploiement.security.W021 : vous n’avez pas défini le réglage
SECURE_HSTS_PRELOADĂTrue. Sans cela, votre site ne peut pas ĂŞtre proposĂ© Ă la liste de prĂ©chargement des navigateurs.security.W022 : vous n’avez pas dĂ©fini le rĂ©glage
SECURE_REFERRER_POLICY. Sans cela, votre site n’enverra pas d’en-tête Referrer-Policy. Vous devriez envisager d’activer cet en-tête pour protéger la confidentialité des utilisateurs.security.E023 : la valeur contenue dans le réglage
SECURE_REFERRER_POLICYn’est pas valable.security.E024 : la valeur contenue dans le réglage
SECURE_CROSS_ORIGIN_OPENER_POLICYn’est pas valable.security.W025 : la clé
SECRET_KEY_FALLBACKS[n]contient moins de 50 caractères, moins de 5 caractères différents ou est préfixée par'django-insecure-', ce qui indique qu’elle a été générée automatiquement par Django. Veuillez générer une valeur longue et aléatoire, faute de quoi de nombreuses fonctionnalités de Django liées à la sécurité seront vulnérables aux attaques.
Les contrôles suivants vérifient que les réglages liés à la sécurité sont correctement configurés :
security.E100 :
DEFAULT_HASHING_ALGORITHMdoit contenir'sha1'ou'sha256'. Ce contrôle est apparu dans Django 3.1 et 3.2.security.E101 : la vue d’échec CSRF
chemin.vers.vuen’accepte pas le bon nombre d’arguments.security.E102 : la vue d’échec CSRF
chemin.vers.vuen’a pas pu être importée.
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 est configuré correctement :
templates.E001Â :
'APP_DIRS': Truefigure dans votre réglageTEMPLATESmais'loaders'est aussi dansOPTIONS. SupprimezAPP_DIRSou l’option'loaders'. Ce contrôle a été supprimé dans Django 5.1 car les contrôles système peuvent dorénavant générerImproperlyConfiguredà la place.templates.E002 :
string_if_invaliddansTEMPLATESOPTIONSdoit être une chaîne, mais c’est actuellement :{valeur}({type}).templates.E003:
<name>est utilisé pour plusieurs modules de balises de gabarits:<module list>. Ce contrôle a été modifié entemplates.W003dans Django 4.1.2.templates.W003 :
<name>est utilisé pour plusieurs modules de balises de gabarits :<module list>.
Traduction¶
Les contrôles suivants sont effectués sur votre configuration de traduction :
translation.E001: le réglage
LANGUAGE_CODEcontient une valeur non valide :<valeur>.translation.E002 : le code de langue contenu dans le réglage
LANGUAGESn’est pas valable :<valeur>.translation.E003 : le code de langue contenu dans le réglage
LANGUAGES_BIDIn’est pas valable :<valeur>.translation.E004: la valeur contenue dans le réglage
LANGUAGE_CODEn’est pas présente dans le réglageLANGUAGES.
URL¶
Les contrôles suivants sont effectués sur votre configuration d’URL :
urls.W001 : le motif d’URL
<pattern>utiliseinclude()avec une expressionroutese terminant par$. Enlevez le dollar de l’expressionroutepour éviter des problèmes lors de l’inclusion d’URL.urls.W002 : le motif d’URL
<pattern>possède une expressionroutecommençant par/. Enlevez cette barre oblique car elle n’est pas nécessaire. Si ce motif est référencé par uninclude(), vérifiez que le motifinclude()se termine par/.urls.W003 : le motif d’URL
<pattern>possède un nomnamecontenant 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 queurlpatternsest bien une liste d’instancespath()oure_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/STATIC_URLdoivent se terminer par une barre oblique.urls.E007: la vue
handlerXXXpersonnalisée'chemin.vers.vue'ne prend pas le nombre correct de paramètres (…).urls.E008 : la vue
handlerXXXpersonnalisée'chemin.vers.vue'n’a pas pu être importée.urls.E009 : le motif d’URL
<motif>possède un vue non valable, passez<vue>.as_view()au lieu de<vue>.urls.W010 : le motif d’URL
<motif>possède un<chevron>non symétrique.
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 qui est inscrite auprès du site d’administration :
admin.E001Â : la valeur de
raw_id_fieldsdoit ĂŞ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 champ 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
fieldsdoit ĂŞtre une liste ou un tuple.admin.E005Â :
fieldsetsetfieldssont tous deux spécifiés.admin.E006 : la valeur de
fieldscontient des champs en double.admin.E007Â : la valeur de
fieldsetsdoit ĂŞ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Â : la valeur de
fields[n]/filter_horizontal[n]/filter_vertical[n]/fieldsets[n][m]ne peut pas inclure le champManyToManyField<nom_de_champ>, car ce champ définit manuellement un modèle de relation.admin.E014 : la valeur de
excludedoit ĂŞtre une liste ou un tuple.admin.E015 : la valeur de
excludecontient des champs en double.admin.E016Â : la valeur de
formdoit hériter deBaseModelForm.admin.E017 : la valeur de
filter_verticaldoit ĂŞtre une liste ou un tuple.admin.E018Â : la valeur de
filter_horizontaldoit ĂŞtre une liste ou un tuple.admin.E019Â : la valeur de
filter_vertical[n]/filter_horizontall[n]fait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas un champ de<modèle>.admin.E020 : la valeur de
filter_vertical[n]/filter_horizontal[n]doit ĂŞtre un champ plusieurs-Ă -plusieurs.admin.E021Â : la valeur de
radio_fieldsdoit ĂŞtre un dictionnaire.admin.E022Â : la valeur de
radio_fieldsfait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas un champ de<modèle>.admin.E023 : la valeur de
radio_fieldsfait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas une instance de clĂ©ForeignKeyet n’a pas de dĂ©finitionchoices.admin.E024 : la valeur de
radio_fields[<nom_de_champ>]doit ĂŞtre soitadmin.HORIZONTALsoitadmin.VERTICAL.admin.E025Â : la valeur de
view_on_sitedoit être soit un objet exécutable, soit une valeur booléenne.admin.E026 : la valeur de
prepopulated_fieldsdoit ĂŞtre un dictionnaire.admin.E027Â : la valeur de
prepopulated_fieldsfait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas un champ de<modèle>.admin.E028 : la valeur de
prepopulated_fieldsfait rĂ©fĂ©rence Ă<nom_de_champ>, qui ne doit pas ĂŞtre un champDateTimeField,ForeignKey,OneToOneFieldniManyToManyField.admin.E029 : la valeur de
prepopulated_fields[<nom_de_champ>]doit ĂŞtre une liste ou un tuple.admin.E030Â : la valeur de
prepopulated_fieldsfait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas un champ de<modèle>.admin.E031 : la valeur de
orderingdoit ĂŞtre une liste ou un tuple.admin.E032 : la valeur de
orderinga le marqueur d’ordre aléatoire?, mais contient aussi d’autres champs.admin.E033 : la valeur de
orderingfait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas un champ de<modèle>.admin.E034 : la valeur de
readonly_fieldsdoit ĂŞtre une liste ou un tuple.admin.E035Â : la valeur de
readonly_fields[n]fait rĂ©fĂ©rence Ă<nom_de_champ>, qui n’est pas un objet exĂ©cutable, un attribut de<classe ModelAdmin>, ni un attribut de<modèle>.admin.E036 : la valeur de
autocomplete_fieldsdoit ĂŞ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 champ 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éfinirsearch_fieldscar 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 qui est enregistrée auprès du site d’administration:
admin.E101: La valeur de
save_asdoit être un booléen.admin.E102: La valeur de
save_on_topdoit être un booléen.admin.E103: La valeur de
inlinesdoit ĂŞtre une liste ou un tuple.admin.E104Â :
<InlineModelAdmin class>doit hériter deInlineModelAdmin.admin.E105:
<InlineModelAdmin class>doit avoir un attributmodel.admin.E106: La valeur de
<InlineModelAdmin class>.modeldoit ĂŞtre unModel.admin.E107: La valeur de
list_displaydoit ĂŞ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, une mĂ©thode ou un champ de<modèle>.admin.E109 : la valeur de
list_display[n]ne peut pas être un champ plusieurs-à -plusieurs ni une clé étrangère inverse.admin.E110 : La valeur de
list_display_linksdoit ĂŞtre une liste, un tuple ouNone.admin.E111Â : la valeur de
list_display_links[n]fait rĂ©fĂ©rence Ă<label>, qui n’est pas dĂ©fini danslist_display.admin.E112 : La valeur de
list_filterdoit ĂŞtre une liste ou un tuple.admin.E113Â : la valeur de
list_filter[n]doit hériter deListFilter.admin.E114 : la valeur de
list_filter[n]ne doit pas hériter deFieldListFilter.admin.E115 : la valeur de
list_filter[n][1]doit hériter deFieldListFilter.admin.E116 : la valeur de
list_filter[n]fait rĂ©fĂ©rence Ă<label>, qui ne fait pas rĂ©fĂ©rence Ă un champField.admin.E117 : la valeur de
list_select_relateddoit être une valeur booléenne, un tuple ou une liste.admin.E118 : la valeur de
list_per_pagedoit ĂŞtre un nombre entier.admin.E119Â : la valeur de
list_max_show_alldoit ĂŞtre un nombre entier.admin.E120Â : la valeur de
list_editabledoit ĂŞtre une liste ou un tuple.admin.E121Â : la valeur de
list_editable[n]fait rĂ©fĂ©rence Ă<label>, qui n’est pas un champ de<modèle>.admin.E122 : la valeur de
list_editable[n]fait rĂ©fĂ©rence Ă<label>, qui ne figure pas danslist_display.admin.E123 : la valeur de
list_editable[n]ne peut pas ĂŞtre Ă la fois danslist_editableet danslist_display_links.admin.E124Â : la valeur de
list_editable[n]fait référence au tout premier champ danslist_display(<label>), qui ne peut pas utilisé tant quelist_display_linksn’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_fieldsdoit ĂŞtre une liste ou un tuple.admin.E127Â : la valeur de
date_hierarchyfait rĂ©fĂ©rence Ă<nom_de_champ>, qui ne se rĂ©fère pas Ă un champ.admin.E128 : la valeur de
date_hierarchydoit ĂŞtre un champDateFieldouDateTimeField.admin.E129 :
<modeladmin>doit définir une méthodehas_<foo>_permission()pour l’action<action>.admin.E130 : les attributs
__name__des actions définies dans<modeladmin>doivent être uniques. Le nom<nom>n’est pas unique.
InlineModelAdmin¶
Les contrôles suivants sont effectués sur chaque InlineModelAdmin qui est inscrit comme élément intégré dans une classe 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éForeignKeyvers<modèle parent>./<modèle> `` a plus d'une clé ``ForeignKeyvers<modèle parent>. Vous devez indiquer un attributfk_name.admin.E203 : la valeur de
extradoit ĂŞtre un nombre entier.admin.E204Â : la valeur de
max_numdoit ĂŞtre un nombre entier.admin.E205Â : la valeur de
min_numdoit ĂŞtre un nombre entier.admin.E206Â : la valeur de
formsetdoit hériter deBaseModelFormSet.
GenericInlineModelAdmin¶
Les contrôles suivants sont effectués sur chaque GenericInlineModelAdmin qui est inscrit comme élément intégré dans une classe ModelAdmin.
admin.E301Â :
<modèle>n’a pas de cléGenericForeignKey.admin.E302 :
'champ_ct'fait rĂ©fĂ©rence Ă<label>, qui n’est pas un champ de<modèle>.admin.E303 :
'champ_ct_fk'fait rĂ©fĂ©rence Ă<label>, qui n’est pas un champ de<modèle>.admin.E304 :
<modèle>n’a pas de cléGenericForeignKeyutilisant 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 par défaut :
admin.E401Â :
django.contrib.contenttypesdoit être dansINSTALLED_APPSpour pouvoir utiliser l’application d’administration.admin.E402 :
django.contrib.auth.context_processors.authdoit être activé dansDjangoTemplates(TEMPLATES) si le moteur d’authentification par défaut est actif pour pouvoir utiliser l’application d’administration.admin.E403 : une instance de
DjangoTemplatesdoit être configurée dansTEMPLATESpour pouvoir utiliser l’application d’administration.admin.E404 :
django.contrib.messages.context_processors.messagesdoit être activé dansDjangoTemplates(TEMPLATES) pour pouvoir utiliser l’application d’administration.admin.E405 :
django.contrib.authdoit être dansINSTALLED_APPSpour pouvoir utiliser l’application d’administration.admin.E406 :
django.contrib.messagesdoit être dansINSTALLED_APPSpour pouvoir utiliser l’application d’administration.admin.E408 :
django.contrib.auth.middleware.AuthenticationMiddlewaredoit être dansMIDDLEWAREpour pouvoir utiliser l’application d’administration.admin.E409 :
django.contrib.messages.middleware.MessageMiddlewaredoit être dansMIDDLEWAREpour pouvoir utiliser l’application d’administration.admin.E410 :
django.contrib.sessions.middleware.SessionMiddlewaredoit être dansMIDDLEWAREpour pouvoir utiliser l’application d’administration.admin.W411 :
django.template.context_processors.requestdoit être activé dansDjangoTemplates(TEMPLATES) pour pouvoir utiliser le panneau latéral du site d’administration.
auth¶
auth.E001 :
REQUIRED_FIELDSdoit être une liste ou un tuple.auth.E002 : le champ désigné en tant que
USERNAME_FIELDpour un modèle utilisateur personnalisé ne doit pas être inclus dansREQUIRED_FIELDS.auth.E003 :
<champ>doit être unique car il est désigné commeUSERNAME_FIELD.auth.W004 :
<champ>est désigné commeUSERNAME_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_namedu 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_anonymousdoit ê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_authenticateddoit ê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.E011 : le nom du modèle
<modèle>ne doit pas dépasser 93 caractères pour que ses noms de permissions automatiques ne dépassent pas 100 caractères.auth.E012 : la permission avec nom de code
<nom_code>du modèle<modèle>est plus longue que 100 caractères.auth.E013 : pour pouvoir utiliser
django.contrib.auth.middleware.LoginRequiredMiddleware,django.contrib.auth.middleware.AuthenticationMiddlewaredoit figurer d’abord dansMIDDLEWARE.
contenttypes¶
Les contrôles suivants sont effectués quand un modèle contient une clé GenericForeignKey ou une relation GenericRelation:
contenttypes.E001 : l’ID d’objet
GenericForeignKeyfait référence au champ<field>qui n’existe pas.contenttypes.E002 : le type de contenu
GenericForeignKeyfait référence au champ<field>inexistant.contenttypes.E003 :
<champ>n’est pas une cléForeignKey.contenttypes.E004 :
<field>n’est pas uneForeignKeyverscontenttypes.ContentType.contenttypes.E005 : les noms de modèles ne peuvent pas dépasser 100 caractères.
postgres¶
Les contrôles suivants s’appliquent aux champs de modèle django.contrib.postgres:
postgres.E001 : le champ de base du tableau comporte des erreurs : …
postgres.E001 : le champ de base du tableau ne peut pas ĂŞtre un champ de relation.
postgres.E003 : la valeur par défaut de
<champ>doit être un objet exécutable plutôt qu’une instance afin qu’elle ne soit pas partagée entre toutes les instances de ce champ. Ce contrôle a été modifié enfields.E010dans Django 3.1.postgres.W004: le champ de base du tableau génère des avertissements : …
sites¶
Les contrôles suivants sont effectués sur chaque modèle utilisant un gestionnaire CurrentSiteManager:
sites.E001Â :
CurrentSiteManagern’a pas réussi à trouver un champ nommé<nom_de_champ>.sites.E002 :
CurrentSiteManagerne peut pas utiliser<champ>car ce n’est pas une clé étrangère ni un champ plusieurs-à -plusieurs.
Les contrôles suivants vérifient que django.contrib.sites est configuré correctement :
sites.E101 : le réglage
SITE_IDdoit ĂŞtre un nombre entier.
staticfiles¶
Les contrôles suivants vérifient que django.contrib.staticfiles est configuré correctement :
staticfiles.E001 : le réglage
STATICFILES_DIRSn’est pas un tuple ni une liste.staticfiles.E002 : le réglage
STATICFILES_DIRSne doit pas contenir le réglageSTATIC_ROOT.staticfiles.E003 : le préfixe
<préfixe>dans le réglageSTATICFILES_DIRSne peut pas se terminer par une barre oblique.staticfiles.W004 : le répertoire
<répertoire>dans le réglageSTATICFILES_DIRSn’existe pas.staticfiles.E005 : le réglage
STORAGESdoit définir un stockage de typestaticfiles.