Skip to main content

系统检查框架

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

有关如何添加自己的检查并将它们与Django的系统检查集成的详细信息,请参阅 系统检查主题指南

API参考

CheckMessage

class CheckMessage(level, msg, hint=None, obj=None, id=None)[源代码]

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

构造函数参数是:

level

消息的严重性。使用预定义值之一:DEBUGINFOWARNINGERRORCRITICAL。如果级别大于或等于 ERROR,则Django将阻止管理命令执行。具有低于 ERROR (即警告)的级别的消息被报告给控制台,但可以被静音。

msg

描述问题的短(小于80个字符)字符串。字符串应该 not 包含换行符。

hint

一个单行字符串,提供了修复问题的提示。如果不能提供提示,或者从错误消息中提示是不言而喻的,则可以省略该提示,或者可以使用 None 的值。

obj

可选的。提供消息上下文的对象(例如,发现问题的模型)。对象应该是模型,字段或管理器或定义 __str__ 方法的任何其他对象(在Python 2上,您需要定义 __unicode__ 方法)。在报告所有消息时使用该方法,并且其结果在消息之前。

id

可选字符串。问题的唯一标识符。标识符应该遵循模式 applabel.X001,其中 X 是字母 CEWID 之一,指示消息严重性(关键字的 C,错误的 E 等)。该数字可以由应用程序分配,但在该应用程序中应该是唯一的。

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

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)[源代码]

内置检查

内置标签

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

  • models:检查管理模型,字段和管理器定义。

  • signals:检查信号声明和处理程序注册。

  • admin:检查任何管理网站声明。

  • compatibility:标记版本升级的潜在问题。

  • security:检查安全相关的配置。

  • templates:检查模板相关配置。

  • caches:检查缓存相关配置。

  • urls:检查URL配置。

  • database:检查数据库相关的配置问题。默认情况下不运行数据库检查,因为它们比常规检查做的静态代码分析更多。它们仅由 migrate 命令运行或者在调用 check 命令时指定 database 标记。

New in Django 1.10:

添加了 database 标签。

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

核心系统检查

楷模

  • 模型<swappable> 不是 app_label.app_name 的形式。

  • 模型<SETTING> 引用了 <model>,它还没有安装,或者是抽象的。

  • 模型:该模型通过中间模型 <app_label>.<model> 具有两个多对多关系。

  • 模型id 只能用作字段名称,如果字段也设置 primary_key=True

  • 模型:来自母模型 <model> 的字段 <field name> 与来自母模型 <model> 的字段 <field name> 冲突。

  • 模型:该字段与模型 <model> 中的字段 <field name> 冲突。

  • 模型:字段 <field name> 具有由另一个字段使用的列名称 <column name>

  • 模型index_together 必须是列表或元组。

  • 模型:所有 index_together 元素必须是列表或元组。

  • 模型unique_together 必须是列表或元组。

  • 模型:所有 unique_together 元素必须是列表或元组。

  • 模型index_together/unique_together 是指不存在的字段 <field name>

  • 模型index_together/unique_together 是指 ManyToManyField <field name>,但该选项不支持 ManyToManyField

  • 模型ordering 必须是元组或列表(即使您只想按照一个字段排序)。

  • 模型ordering 是指不存在的字段 <field name>

  • 模型index_together/unique_together 是指对模型 <model> 不是局部的场 <field_name>

  • 模型:代理模型 <model> 包含模型字段。

  • 模型:自动生成的列名称对于字段 <field> 过长。数据库 <alias> 的最大长度为 <maximum length>

  • 模型:M2M字段 <M2M field> 的自动生成列名太长。数据库 <alias> 的最大长度为 <maximum length>

  • 型号<model>.check() 类方法当前被覆盖。

  • 模型orderingorder_with_respect_to 不能一起使用。

  • 模型<function> 包含对 <app label>.<model> 的惰性引用,但是app <app label> 未安装或不提供模型 <model>

字段

  • fields.E001:字段名称不能以下划线结尾。

  • 字段:字段名称不能包含 "__"

  • 字段pk 是不能用作字段名称的保留字。

  • 字段choices 必须是可迭代的(例如,列表或元组)。

  • 字段choices 必须是一个可迭代的返回 (actual value, human readable name) 元组。

  • 字段db_index 必须是 NoneTrueFalse

  • 字段:主键不能有 null=True

  • fields.E100AutoField s必须设置primary_key = True。

  • 字段BooleanField s不接受空值。

  • 字段CharField s必须定义一个 max_length 属性。

  • 字段max_length 必须是正整数。

  • 字段:当与 IntegerField 一起使用时,max_length 被忽略。

  • 字段DecimalField s必须定义一个 decimal_places 属性。

  • 字段decimal_places 必须是非负整数。

  • 字段DecimalField s必须定义一个 max_digits 属性。

  • 字段max_digits 必须是非负整数。

  • 字段max_digits 必须大于或等于 decimal_places

  • 字段FilePathField s必须将 allow_filesallow_folders 设置为True。

  • 字段:如果不允许空值,则 GenericIPAddressField s不能接受空值,因为空值存储为空值。

  • 字段:选项 auto_nowauto_now_adddefault 是互斥的。只有其中一个选项可能存在。

  • 字段:提供固定的默认值。

  • fields.E900IPAddressField 已被删除,除了支持历史迁移。

  • fields.W900IPAddressField 已被弃用。对它的支持(除了历史迁移)将在Django 1.9中删除。 这个检查出现在Django 1.7和1.8

  • 字段CommaSeparatedIntegerField 已被弃用。对它的支持(除了历史迁移)将在Django 2.0中删除。

文件字段

  • fields.E200unique 不是 FileField 的有效参数。

  • 字段primary_key 不是 FileField 的有效参数。

  • 字段:无法使用 ImageField,因为未安装枕头。

信号

  • 信号<handler> 连接到 <signal> 信号,对发送方 <app label>.<model> 的延迟引用,但app <app label> 未安装或不提供模型 <model>

向后兼容性

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

  • 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 字典优先。您必须将以下设置的值放入默认值 TEMPLATES dict:TEMPLATE_DIRSTEMPLATE_CONTEXT_PROCESSORSTEMPLATE_DEBUGTEMPLATE_LOADERSTEMPLATE_STRING_IF_INVALID

  • 1_10.W001:在Django 1.10中已弃用 MIDDLEWARE_CLASSES 设置,MIDDLEWARE 设置优先。由于你设置了 MIDDLEWAREMIDDLEWARE_CLASSES 的值被忽略。

管理员

管理员检查都是作为 admin 标签的一部分执行的。

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

  • admin.E001raw_id_fields 的值必须是列表或元组。

  • admin.E002raw_id_fields[n] 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E003raw_id_fields[n] 的值必须是外键或多对多字段。

  • admin.E004fields 的值必须是列表或元组。

  • admin.E005:指定 fieldsetsfields

  • admin.E006fields 的值包含重复字段。

  • admin.E007fieldsets 的值必须是列表或元组。

  • admin.E008fieldsets[n] 的值必须是列表或元组。

  • admin.E009fieldsets[n] 的值必须为2。

  • admin.E010fieldsets[n][1] 的值必须是字典。

  • admin.E011fieldsets[n][1] 的值必须包含密钥 fields

  • admin.E012fieldsets[n][1] 中存在重复字段。

  • admin.E013fields[n]/fieldsets[n][m] 不能包括 ManyToManyField <field name>,因为该字段手动指定关系模型。

  • admin.E014exclude 的值必须是列表或元组。

  • admin.E015exclude 的值包含重复字段。

  • admin.E016form 的值必须从 BaseModelForm 继承。

  • admin.E017filter_vertical 的值必须是列表或元组。

  • admin.E018filter_horizontal 的值必须是列表或元组。

  • admin.E019filter_vertical[n]/filter_vertical[n] 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E020filter_vertical[n]/filter_vertical[n] 的值必须是多对多字段。

  • admin.E021radio_fields 的值必须是字典。

  • admin.E022radio_fields 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E023radio_fields 的值是指 <field name>,其不是 ForeignKey,并且不具有 choices 定义。

  • admin.E024radio_fields[<field name>] 的值必须为 admin.HORIZONTALadmin.VERTICAL

  • admin.E025view_on_site 的值必须是可调用值或布尔值。

  • admin.E026prepopulated_fields 的值必须是字典。

  • admin.E027prepopulated_fields 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E028prepopulated_fields 的值指的是 <field name>,它不能是 DateTimeFieldForeignKeyManyToManyField 字段。

  • admin.E029prepopulated_fields[<field name>] 的值必须是列表或元组。

  • admin.E030prepopulated_fields 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E031ordering 的值必须是列表或元组。

  • admin.E032ordering 的值具有随机排序标记 ?,但也包含其他字段。

  • admin.E033ordering 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E034readonly_fields 的值必须是列表或元组。

  • admin.E035readonly_fields[n] 的值不是可调用的,<ModelAdmin class> 的属性或 <model> 的属性。

ModelAdmin

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

  • admin.E101save_as 的值必须是布尔值。

  • admin.E102save_on_top 的值必须是布尔值。

  • admin.E103inlines 的值必须是列表或元组。

  • admin.E104<InlineModelAdmin class> 必须继承 BaseModelAdmin

  • admin.E105<InlineModelAdmin class> 必须具有 model 属性。

  • admin.E106<InlineModelAdmin class>.model 的值必须为 Model

  • admin.E107list_display 的值必须是列表或元组。

  • admin.E108list_display[n] 的值指的是 <label>,它不是可调用的,<ModelAdmin class> 的属性或 <model> 上的属性或方法。

  • admin.E109list_display[n] 的值不能为 ManyToManyField 字段。

  • admin.E110list_display_links 的值必须是一个列表,一个元组或 None

  • admin.E111list_display_links[n] 的值指 <label>,其在 list_display 中未定义。

  • admin.E112list_filter 的值必须是列表或元组。

  • admin.E113list_filter[n] 的值必须从 ListFilter 继承。

  • admin.E114list_filter[n] 的值不能从 FieldListFilter 继承。

  • admin.E115list_filter[n][1] 的值必须从 FieldListFilter 继承。

  • admin.E116list_filter[n] 的值指的是 <label>,它不是指字段。

  • admin.E117list_select_related 的值必须是布尔值,元组或列表。

  • admin.E118list_per_page 的值必须为整数。

  • admin.E119list_max_show_all 的值必须为整数。

  • admin.E120list_editable 的值必须是列表或元组。

  • admin.E121list_editable[n] 的值是指 <label>,它不是 <model> 的属性。

  • admin.E122list_editable[n] 的值指向 <label>,不包含在 list_display 中。

  • admin.E123list_editable[n] 的值不能在 list_editablelist_display_links 中。

  • admin.E124list_editable[n] 的值指的是 list_display<label>)中的第一个字段,除非设置 list_display_links,否则不能使用。

  • admin.E125list_editable[n] 的值指的是 <field name>,不能通过admin编辑。

  • admin.E126search_fields 的值必须是列表或元组。

  • admin.E127date_hierarchy 的值是指 <field name>,它不是 <model> 的属性。

  • admin.E128date_hierarchy 的值必须是 DateFieldDateTimeField

InlineModelAdmin

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

  • admin.E201:不能排除字段 <field name>,因为它是父模型 <app_label>.<model> 的外键。

  • admin.E202<model> 没有 ForeignKey<parent model> ./<model> 有多个 ForeignKey<parent model>

  • admin.E203extra 的值必须为整数。

  • admin.E204max_num 的值必须为整数。

  • admin.E205min_num 的值必须为整数。

  • admin.E206formset 的值必须从 BaseModelFormSet 继承。

GenericInlineModelAdmin

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

  • admin.E301'ct_field' 引用 <label>,它不是 <model> 上的字段。

  • admin.E302'ct_fk_field' 引用 <label>,它不是 <model> 上的字段。

  • admin.E303<model> 没有 GenericForeignKey

  • admin.E304<model> 没有使用内容类型字段 <field name> 和对象ID字段 <field name>GenericForeignKey

AdminSite

将对默认 AdminSite 执行以下检查:

Auth

  • auth.E001REQUIRED_FIELDS 必须是列表或元组。

  • auth.E002:为自定义用户模型命名为 USERNAME_FIELD 的字段不能包含在 REQUIRED_FIELDS 中。

  • auth.E003<field> 必须是唯一的,因为它被命名为 USERNAME_FIELD

  • auth.W004<field> 被命名为 USERNAME_FIELD,但它不是唯一的。

  • auth.E005:权限代号 <codename> 与模型 <model> 的内置权限冲突。

  • auth.E006:代码为 <codename> 的权限与模型 <model> 重复。

  • auth.E007:模型 <model>verbose_name 最多不得超过244个字符,其内置权限名称最多为255个字符。

  • auth.E008:模型 <model> 的名为 <name> 的权限长于255个字符。

  • auth.C009<User model>.is_anonymous 必须是属性或属性,而不是方法。忽略这是一个安全问题,因为匿名用户将被视为已验证!

  • auth.C010<User model>.is_authenticated 必须是属性或属性,而不是方法。忽略这是一个安全问题,因为匿名用户将被视为已验证!

内容类型

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

  • 内容类型GenericForeignKey 对象ID引用不存在的字段 <field>

  • contenttypes.E002GenericForeignKey 内容类型引用不存在的字段 <field>

  • contenttypes.E003<field> 不是 ForeignKey

  • contenttypes.E004<field> 不是对 contenttypes.ContentTypeForeignKey

安全

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

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

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

网站

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

  • 网站CurrentSiteManager 找不到名为 <field name> 的字段。

  • 网站CurrentSiteManager 不能使用 <field>,因为它不是外键或多对多字段。

数据库

MySQL

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

  • mysql.E001:MySQL不允许唯一的 CharField 具有 max_length > 255。

  • mysql.W002:未对数据库连接“<alias>”设置MySQL严格模式。参见 设置 sql_mode

模板

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

  • templates.E001:您的 TEMPLATES 中有 'APP_DIRS': True,但在 OPTIONS 中还指定 'loaders'。删除 APP_DIRS 或删除 'loaders' 选项。

  • templates.E002TEMPLATES 中的 string_if_invalid OPTIONS 必须是字符串,但得到:{value}{type})。

缓存

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

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

网址

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

  • urls.W001:您的网址格式 <pattern> 使用 include()regex$ 结尾。从 regex 中删除美元,以避免包括网址在内的问题。

  • urls.W002:您的网址格式 <pattern> 有一个以 / 开头的 regex。删除此斜杠,因为它是不必要的。如果此模式针对 include(),请确保 include() 模式具有尾随 /

  • urls.W003:您的网址格式 <pattern> 有一个包含 :name。删除冒号,以避免模糊的命名空间引用。

  • url.E004:您的网址格式 <pattern> 无效。确保 urlpatternsurl() 实例的列表。