System check framework

系统检查框架是一组用于验证Django项目的静态检查。 它检测常见问题并提供如何修复它们的提示。 框架是可扩展的,因此您可以轻松添加自己的检查。

有关如何添加自己的检查并将其与Django的系统检查集成的详细信息,请参阅System check topic guide

API参考

CheckMessage

CheckMessage(level, msg, hint=None, obj=None, id=None)[source]

系统检查引起的警告和错误必须是CheckMessage的实例。 一个实例封装了一个可报告的错误或警告。 它还提供适用于消息的上下文和提示,以及用于过滤目的的唯一标识符。

构造函数的参数是:

水平
消息的严重性。 Use one of the predefined values: DEBUG, INFO, WARNING, ERROR, CRITICAL. 如果该级别大于等于ERROR,则Django将阻止管理命令执行。 低于ERROR的消息(即警告)将报告给控制台,但可以静音。
味精
描述问题的短(小于80个字符)的字符串。 字符串包含换行符。
暗示
单行字符串提供了解决问题的提示。 如果不能提供提示,或者从错误信息中提示不言而喻,则可以省略提示,或者可以使用None的值。
OBJ
可选的。 为消息提供上下文的对象(例如,发现问题的模型)。 该对象应该是一个模型,字段或者管理器或定义__str__方法的任何其他对象(在Python 2上需要定义__unicode__方法)。 该方法在报告所有消息时使用,其结果位于消息之前。
ID
可选字符串。 问题的唯一标识符。 Identifiers should follow the pattern applabel.X001, where X is one of the letters CEWID, indicating the message severity (C for criticals, E for errors and so). 该号码可以由应用程序分配,但在该应用程序中应该是唯一的。

有一些子类使得创建具有共同级别的消息更容易。 使用它们时,您可以省略level参数,因为它是由类名隐含的。

Debug(msg, hint=None, obj=None, id=None)[source]
Info(msg, hint=None, obj=None, id=None)[source]
Warning(msg, hint=None obj=None, id=None)[source]
Error(msg, hint=None, obj=None, id=None)[source]
Critical(msg, hint=None, obj=None, id=None)[source]

Builtin tags

Django的系统检查使用以下标记进行组织:

  • admin:检查任何管理网站声明。
  • caches:检查缓存相关配置。
  • compatibility:标记版本升级的潜在问题。
  • database:检查数据库相关的配置问题。 数据库检查不会默认运行,因为它们比常规检查执行的静态代码分析更多。 它们仅由migrate命令运行,或者在调用check命令时指定database标记。
  • models:检查模型,字段和管理器定义。
  • security:检查安全相关的配置。
  • signals:检查信号声明和处理程序注册。
  • templates:检查模板相关配置。
  • urls:检查URL配置。

某些检查可能会向多个标签注册。

Core system checks

向后兼容

执行以下检查以警告用户由于版本升级可能发生的任何潜在问题。

  • 1_6.W001:某些项目单元测试可能无法按预期执行。 由于误报,此检查在Django 1.8中已删除。
  • 1_6.W002BooleanField没有默认值。 由于误报,此检查在Django 1.8中已删除。
  • 1_7.W001:Django 1.7更改了全局默认值 MIDDLEWARE_CLASSES。 django.contrib.sessions.middleware.SessionMiddlewaredjango.contrib.auth.middleware.AuthenticationMiddlewaredjango.contrib.messages.middleware.MessageMiddleware 如果你的项目需要这些中间件,那么你应该配置这个设置。 此检查已在Django 1.9中删除。
  • 1_8.W001:独立的TEMPLATE_*设置在Django 1.8中已被弃用,TEMPLATES字典优先。 You must put the values of the following settings into your defaults TEMPLATES dict: TEMPLATE_DIRS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_LOADERS, TEMPLATE_STRING_IF_INVALID.
  • 1_10.W001:Django 1.10中不推荐使用MIDDLEWARE_CLASSES设置,而MIDDLEWARE设置优先。 由于您设置了MIDDLEWARE,所以忽略MIDDLEWARE_CLASSES的值。

高速缓存¶ T0>

以下检查将验证您的CACHES设置是否正确配置:

  • caches.E001:您必须在CACHES设置中定义'default'缓存。

Database

MySQL

如果您使用MySQL,将执行以下检查:

  • mysql.E001:MySQL不允许唯一的max_length具有CharField> 255。
  • mysql.W002: MySQL Strict Mode is not set for database connection ‘<alias>’. 另请参见Setting sql_mode

模型字段

  • fields.E001:字段名称不能以下划线结尾。
  • fields.E002:字段名称不能包含"__"
  • fields.E003pk是不能用作字段名称的保留字。
  • fields.E004choices必须是可迭代的(例如,列表或元组)。
  • fields.E005choices必须是可迭代的(实际 / t6> 可读 名称)元组。
  • fields.E006None必须是Falsedb_indexTrue
  • fields.E007:主键不能有null=True
  • fields.E100AutoField必须设置primary_key = True。
  • fields.E110BooleanField不接受空值。
  • fields.E120max_length必须定义CharField属性。
  • fields.E121max_length必须为正整数。
  • fields.W122IntegerFieldmax_length配合使用时将被忽略。
  • fields.E130decimal_places必须定义DecimalField属性。
  • fields.E131decimal_places必须是非负整数。
  • fields.E132max_digits必须定义DecimalField属性。
  • fields.E133max_digits必须是非负整数。
  • fields.E134decimal_places必须大于或等于max_digits
  • fields.E140allow_files必须将FilePathFieldallow_folders设置为True。
  • fields.E150GenericIPAddressField不能接受空值,如果不允许空值,因为空值存储为null。
  • fields.E160:选项auto_now_addauto_nowdefault是互斥的。 这些选项中只能有一个存在。
  • fields.W161:提供固定的默认值。
  • fields.E900IPAddressField已被删除,除了历史迁移中的支持。
  • fields.W900IPAddressField已被弃用。 对它的支持(除了历史迁移)将在Django 1.9中删除。 这个检查出现在Django 1.7和1.8中。
  • fields.W901CommaSeparatedIntegerField 对Django 2.0的支持(在历史迁移中除外)将被删除。

文件字段

  • fields.E200FileField不是unique的有效参数。 此检查在Django 1.11中删除。
  • fields.E201FileField不是primary_key的有效参数。
  • fields.E202FileFieldupload_to参数必须是相对路径,而不是绝对路径。
  • fields.E210:由于未安装枕头,无法使用ImageField

Models

  • models.E001app_label.app_name的格式不是<swappable>
  • models.E002<model>引用<SETTING>
  • models.E003:该模型通过中间模型<app_label>.<model>具有两个多对多关系。
  • models.E004primary_key=True只能用作字段名称,如果字段也设置为id
  • models.E005: The field <field name> from parent model <model> clashes with the field <field name> from parent model <model>.
  • models.E006: The field clashes with the field <field name> from model <model>.
  • models.E007:字段&lt;字段 名称&gt;列名称&lt;列 name&gt;被另一个字段使用。
  • models.E008index_together必须是列表或元组。
  • models.E009:所有index_together元素必须是列表或元组。
  • models.E010unique_together必须是列表或元组。
  • models.E011:所有unique_together元素必须是列表或元组。
  • models.E012index_together/unique_together是指不存在的字段&lt; field name&gt;
  • models.E013index_together/unique_together是指ManyToManyField &lt; field name&gt; ,但是该选项不支持ManyToManyField
  • models.E014ordering必须是元组或列表(即使您只想按照一个字段排序)。
  • models.E015ordering是指不存在的字段&lt; field name&gt; T3>。
  • models.E016: index_together/unique_together refers to field <field_name> which is not local to model <model>.
  • models.E017:代理模型<model>包含模型字段。
  • models.E018:对于字段<field>,自动生成的列名称过长。 数据库<alias>的最大长度为 长度
  • models.E019:M2M字段&lt; M2M 字段>的自动生成列名太长。 数据库<alias>的最大长度为 长度
  • models.E020<model>.check()类方法当前被覆盖。
  • models.E021orderingorder_with_respect_to不能一起使用。
  • models.E022<function>包含对&lt; app 标签&gt;的延迟引用。&lt; model&gt; ,但app &lt; app 标签&gt;未安装或不提供模型<model>
  • models.E023:模型名称<model>无法以下划线开始或结束,因为它与查询查询语法相冲突。
  • models.E024:模型名称<model>不能包含双下划线,因为它与查询查询语法相冲突。

Security

安全检查不会使您的网站安全。 他们不审计代码,做入侵检测,或做任何特别复杂的事情。 相反,他们帮助执行自动化,低挂的水果清单。 它们可以帮助您记住提高网站安全性的简单操作。

其中一些检查可能不适合您的特定部署配置。 例如,如果您在负载平衡器中执行HTTP到HTTPS重定向,则会不经常警告您未启用SECURE_SSL_REDIRECT 使用SILENCED_SYSTEM_CHECKS可停止不需要的检查。

如果您使用check --deploy选项,则运行以下检查:

Signals

  • signals.E001<handler>连接到<signal>信号,对发送方&lt; app 标签&gt;。&lt; model&gt;,但app &lt; app label&gt; t10 >未安装或不提供模型<model>

模板¶ T0>

以下检查将验证您的TEMPLATES设置是否正确配置:

  • templates.E001:你有 'APP_DIRS': 真正 TEMPLATES中,还可以在OPTIONS中指定'loaders' 删除APP_DIRS或删除'loaders'选项。
  • templates.E002: string_if_invalid in TEMPLATES OPTIONS must be a string but got: {value} ({type}).

网址¶ T0>

对您的URL配置执行以下检查:

  • urls.W001: Your URL pattern <pattern> uses include() with a regex ending with a $. regex中删除美元,以避免包含URL的问题。
  • urls.W002:您的URL模式<pattern>具有以/开头的regex 删除这个斜杠是不必要的。 如果在include()中定位了此模式,请确保include()模式具有尾部/
  • urls.W003:您的URL模式<pattern>具有name,包括 :. 删除冒号,以避免不明确的命名空间引用。
  • urls.E004:您的网址格式<pattern>无效。 确保urlpatternsurl()实例的列表。
  • urls.W005:URL命名空间<namespace>不是唯一的。 您可能无法撤销此命名空间中的所有URL。
  • urls.E006MEDIA_URL / STATIC_URL设置必须以斜杠结尾。

contrib app check

admin

管理员检查全部作为admin标记的一部分执行。

对在管理站点注册的任何ModelAdmin(或子类)执行以下检查:

  • admin.E001raw_id_fields的值必须是列表或元组。
  • admin.E002raw_id_fields[n]的值是指&lt; field name&gt; / t3>,它不是<model>的属性。
  • admin.E003raw_id_fields[n]的值必须是外键或多对多字段。
  • admin.E004fields必须是列表或元组。
  • admin.E005:指定了fieldsfieldsets
  • admin.E006fields包含重复字段。
  • admin.E007fieldsets的值必须是列表或元组。
  • admin.E008fieldsets[n]的值必须是列表或元组。
  • admin.E009fieldsets[n]的值必须为2。
  • admin.E010fieldsets[n][1]的值必须是字典。
  • admin.E011fields的值必须包含键fieldsets[n][1]
  • admin.E012fieldsets[n][1]中有重复字段。
  • admin.E013ManyToManyField不能包含fields[n]/fieldsets[n][m] &lt; field name&gt;,因为该字段手动指定关系模型。
  • admin.E014exclude的值必须是列表或元组。
  • admin.E015exclude的值包含重复字段。
  • admin.E016BaseModelForm的值必须继承form
  • admin.E017filter_vertical的值必须是列表或元组。
  • admin.E018filter_horizontal的值必须是列表或元组。
  • admin.E019filter_vertical[n]/filter_vertical[n]的值是指&lt; field name&gt; ,它不是<model>的属性。
  • admin.E020filter_vertical[n]/filter_vertical[n]的值必须是多对多字段。
  • admin.E021radio_fields的值必须是字典。
  • admin.E022radio_fields的值是指&lt; field name&gt; ,其不是<model>的属性。
  • admin.E023radio_fields的值指的是&lt; field name&gt; ,其不是choices,并且没有ForeignKey定义。
  • admin.E024radio_fields [&lt; field name&gt;]的值必须是admin.HORIZONTALadmin.VERTICAL
  • admin.E025view_on_site的值必须是可调用值或布尔值。
  • admin.E026prepopulated_fields的值必须是字典。
  • admin.E027prepopulated_fields的值指向&lt; field name&gt; ,其不是<model>的属性。
  • admin.E028prepopulated_fields的值是指&lt; field name&gt; ,它不能是DateTimeFieldForeignKeyOneToOneFieldManyToManyField字段。
  • admin.E029prepopulated_fields [&lt; field name&gt;]的值必须是列表或元组。
  • admin.E030prepopulated_fields的值是指&lt; field name&gt; ,它不是<model>的属性。
  • admin.E031ordering的值必须是列表或元组。
  • admin.E032ordering的值具有随机排序标记 ?,但也包含其他字段。
  • admin.E033ordering的值指的是&lt; field name&gt; ,其不是<model>的属性。
  • admin.E034readonly_fields的值必须是列表或元组。
  • admin.E035readonly_fields[n]的值不是可调用的,属性&lt; ModelAdmin class&gt ;或属性<model>

ModelAdmin

对在管理站点注册的任何ModelAdmin执行以下检查:

  • admin.E101save_as的值必须是布尔值。
  • admin.E102save_on_top的值必须是布尔值。
  • admin.E103inlines的值必须是列表或元组。
  • admin.E104&lt; InlineModelAdmin class&gt;必须继承自InlineModelAdmin
  • admin.E105&lt; InlineModelAdmin class&gt;必须具有model属性。
  • admin.E106&lt; InlineModelAdmin class&gt; .model的值必须为Model
  • admin.E107list_display的值必须是列表或元组。
  • admin.E108<label>的值是指list_display[n],不是可调用的,属性 &lt; ModelAdmin class&gt;<model>上的属性或方法。
  • admin.E109list_display[n]的值不能是ManyToManyField字段。
  • admin.E110None的值必须是列表,元组或list_display_links
  • admin.E111: The value of list_display_links[n] refers to <label>, which is not defined in list_display.
  • admin.E112list_filter的值必须是列表或元组。
  • admin.E113ListFilter的值必须继承list_filter[n]
  • admin.E114FieldListFilter的值不能继承list_filter[n]
  • admin.E115FieldListFilter的值必须继承list_filter[n][1]
  • admin.E116<label>的值指的是不参考字段的list_filter[n]
  • admin.E117list_select_related的值必须是布尔值,元组或列表。
  • admin.E118list_per_page的值必须为整数。
  • admin.E119list_max_show_all的值必须为整数。
  • admin.E120list_editable的值必须是列表或元组。
  • admin.E121<label>的值指代list_editable[n],其不是<model>
  • admin.E122list_editable[n]的值是<label>,它不包含在list_display
  • admin.E123list_editable的值不能同时位于list_editable[n]list_display_links中。
  • admin.E124: The value of list_editable[n] refers to the first field in list_display (<label>), which cannot be used unless list_display_links is set.
  • admin.E125list_editable[n]的值指向&lt; field name&gt; / t3>,这是不能通过管理员编辑。
  • admin.E126search_fields的值必须是列表或元组。
  • admin.E127date_hierarchy的值是&lt; field name&gt; ,它不是指现场。
  • admin.E128DateField的值必须是date_hierarchyDateTimeField

InlineModelAdmin

对在ModelAdmin上注册为内联的任何InlineModelAdmin执行以下检查。

  • admin.E201:不能排除字段&lt; field name&gt;,因为它是父模型<app_label>.<model>
  • admin.E202: <model> has no ForeignKey to <parent model>./ <model> has more than one ForeignKey to <parent model>.
  • admin.E203extra的值必须为整数。
  • admin.E204max_num的值必须为整数。
  • admin.E205min_num的值必须为整数。
  • admin.E206BaseModelFormSet的值必须继承formset

GenericInlineModelAdmin

对在ModelAdmin上注册为内联的任何GenericInlineModelAdmin执行以下检查。

  • admin.E301<label>参考'ct_field',不是<model>
  • admin.E302<label>参考'ct_fk_field',不是<model>
  • admin.E303GenericForeignKey没有<model>
  • admin.E304: <model> has no GenericForeignKey using content type field <field name> and object ID field <field name>.

AdminSite

在默认的AdminSite上执行以下检查:

auth

  • auth.E001REQUIRED_FIELDS必须是列表或元组。
  • auth.E002:自定义用户模型的名为REQUIRED_FIELDS的字段不能包含在USERNAME_FIELD中。
  • auth.E003USERNAME_FIELD必须是唯一的,因为它被命名为<field>
  • auth.W004USERNAME_FIELD命名为<field>,但不是唯一的。
  • auth.E005:代码<codename>的权限与模型<model>的内置权限冲突。
  • auth.E006:代码<codename>的权限对于模型<model>重复。
  • auth.E007:型号<model>verbose_name的内置权限名称最多不得超过244个字符,最多为255个字符。
  • auth.E008:型号<model>的名为<name>的权限长于255个字符。
  • auth.C009&lt; User model&gt; .is_anonymous必须是属性或属性而不是方法。 忽略这是一个安全问题,因为匿名用户将被视为已验证!
  • auth.C010&lt; User model&gt; .is_authenticated必须是属性或属性而不是方法。 忽略这是一个安全问题,因为匿名用户将被视为已验证!

contenttypes

当模型包含GenericForeignKeyGenericRelation时,将执行以下检查:

  • contenttypes.E001<field>对象ID引用不存在的字段GenericForeignKey
  • contenttypes.E002<field>内容类型引用不存在的字段GenericForeignKey
  • contenttypes.E003ForeignKey不是<field>
  • contenttypes.E004ForeignKey不是<field>contenttypes.ContentType

sites

使用CurrentSiteManager在任何模型上执行以下检查:

  • sites.E001CurrentSiteManager找不到名为的字段&lt; field name&gt; t3 >。
  • sites.E002CurrentSiteManager不能使用<field>,因为它不是外键或多对多字段。