系统检查框架 — Django 文档

来自菜鸟教程
Django/docs/3.1.x/ref/checks
跳转至:导航、​搜索

系统检查框架

系统检查框架是一组用于验证 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__() 方法的对象。 该方法在报告所有消息时使用,其结果在消息之前。
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 的系统检查使用以下标签进行组织:

  • admin:检查任何管理站点声明。
  • async_support:检查异步相关的配置。
  • caches:检查缓存相关配置。
  • compatibility:标记版本升级的潜在问题。
  • database:检查与数据库相关的配置问题。 默认情况下不运行数据库检查,因为它们比常规检查所做的静态代码分析更多。 它们仅由 :djadmin:`migrate` 命令运行,或者如果您在调用 :djadmin:`check` 时使用 --database 选项指定配置的数据库别名命令。
  • models:检查模型、字段和管理器定义。
  • security:检查安全相关配置。
  • signals:检查信号声明和处理程序注册。
  • staticfiles:检查 django.contrib.staticfiles 配置。
  • templates:检查模板相关配置。
  • translation:检查翻译相关配置。
  • urls:检查 URL 配置。

某些支票可能会注册多个标签。

3.1 版更改: 添加了 async_support 标签。


3.1 版更改: database 检查现在仅对使用 check --database 选项指定的数据库别名运行。


核心系统检查

异步支持

3.1 版中的新功能。


以下检查验证了 异步支持 的设置:


向后兼容

兼容性检查会警告升级 Django 后可能出现的潜在问题。

  • 2_0.W001:您的网址格式 <pattern> 有一个 route,其中包含 (?P<,以 ^ 开头,或以$。 从 url() 迁移到 path() 时,这可能是一个疏忽。


缓存

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

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


数据库

MySQL 和 MariaDB

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

  • mysql.E001:MySQL/MariaDB 不允许唯一的 CharField 具有 max_length > 255。 此检查在Django 3.1中更改为 mysql.W003 ,因为实际最大大小取决于许多因素。
  • mysql.W002:没有为数据库连接<alias>设置MySQL/MariaDB严格模式。 另见 设置 sql_mode
  • mysql.W003:MySQL/MariaDB 可能不允许唯一的 CharField 具有 max_length > 255。


模型字段

  • fields.E001:字段名称不得以下划线结尾。
  • fields.E002:字段名称不得包含 "__"
  • fields.E003pk是保留字,不能作为字段名。
  • fields.E004choices 必须是可迭代的(例如,列表或元组)。
  • fields.E005: choices 必须是一个可迭代的返回 (actual value, human readable name) 元组。
  • fields.E006db_index 必须是 NoneTrueFalse
  • fields.E007:主键不能有 null=True
  • fields.E008:所有 validators 必须是可调用的。
  • fields.E009max_length 太小,无法容纳 choices 中的最长值(<count> 个字符)。
  • fields.E010: <field> 默认应该是一个可调用的而不是一个实例,这样它就不会在所有字段实例之间共享。
  • fields.E100: AutoFields 必须设置 primary_key=True。
  • fields.E110BooleanFields 不接受空值。 此检查出现在 Django 2.1 中添加对空值的支持之前。
  • fields.E120CharFields 必须定义一个 max_length 属性。
  • fields.E121max_length 必须是正整数。
  • fields.W122max_length<integer field type> 一起使用时会被忽略。
  • fields.E130DecimalFields 必须定义一个 decimal_places 属性。
  • fields.E131decimal_places 必须是非负整数。
  • fields.E132DecimalFields 必须定义一个 max_digits 属性。
  • fields.E133max_digits 必须是非负整数。
  • fields.E134max_digits 必须大于或等于 decimal_places
  • fields.E140FilePathField 必须将 allow_filesallow_folders 设置为 True。
  • fields.E150:如果不允许空值,GenericIPAddressFields 不能接受空值,因为空值存储为空值。
  • fields.E160:选项auto_nowauto_now_adddefault是互斥的。 可能只存在这些选项之一。
  • fields.W161:提供固定默认值。
  • fields.W162<database> 不支持 <field data type> 列上的数据库索引。
  • fields.E170BinaryFielddefault不能是字符串。 改用字节内容。
  • fields.E180: <database> 不支持 JSONFields。
  • fields.E900IPAddressField 已被移除,但支持历史迁移。
  • fields.W900IPAddressField 已被弃用。 对它的支持(历史迁移除外)将在 Django 1.9 中移除。 此检查出现在 Django 1.7 和 1.8 中。
  • fields.W901CommaSeparatedIntegerField 已被弃用。 对它的支持(历史迁移除外)将在 Django 2.0 中删除。 此检查出现在 Django 1.10 和 1.11 中。
  • fields.E901: CommaSeparatedIntegerField 被移除,除了支持历史迁移。
  • fields.W902: FloatRangeField 已弃用,将在 Django 3.1 中删除。 这个检查出现在 Django 2.2 和 3.0
  • fields.W903NullBooleanField 已弃用。 对它的支持(历史迁移除外)将在 Django 4.0 中删除。
  • fields.W904django.contrib.postgres.fields.JSONField 已弃用。 对它的支持(历史迁移除外)将在 Django 4.0 中删除。

文件字段

  • fields.E200unique 不是 FileField 的有效参数。 此检查在 Django 1.11 中被删除。
  • fields.E201primary_key 不是 FileField 的有效参数。
  • fields.E202: FileFieldupload_to 参数必须是相对路径,而不是绝对路径。
  • fields.E210:无法使用 ImageField,因为 Pillow 未安装。


型号

  • models.E001<swappable> 不是 app_label.app_name 的形式。
  • models.E002<SETTING>引用<model>,未安装,或抽象。
  • models.E003:模型通过中间模型<app_label>.<model>有两个相同的多对多关系。
  • models.E004: id 只能作为字段名,如果字段也设置了 primary_key=True
  • models.E005:来自父模型 <model> 的字段 <field name> 与来自父模型 <model> 的字段 <field name> 冲突。
  • models.E006:该字段与来自模型 <model> 的字段 <field name> 冲突。
  • models.E007:字段 <field name> 具有由另一个字段使用的列名称 <column name>
  • models.E008: index_together 必须是列表或元组。
  • models.E009:所有 index_together 元素必须是列表或元组。
  • models.E010: unique_together 必须是列表或元组。
  • models.E011:所有 unique_together 元素必须是列表或元组。
  • models.E012: indexes/index_together/unique_together 指的是不存在的字段 <field name>
  • models.E013indexes/index_together/unique_together 指的是 ManyToManyField <field name>,但该选项不支持 ManyToManyField
  • models.E014: ordering 必须是元组或列表(即使您只想按一个字段排序)。
  • models.E015ordering 指不存在的字段、相关字段或查找 <field name>
  • models.E016indexes/index_together/unique_together 指的是字段 <field_name>,它不是模型 <model> 的本地字段。
  • models.E017:代理模型 <model> 包含模型字段。
  • models.E018:字段 <field> 的自动生成列名称太长。 数据库 <alias> 的最大长度为 <maximum length>
  • models.E019:自动生成的列名称对于 M2M 字段 <M2M field> 来说太长。 数据库 <alias> 的最大长度为 <maximum length>
  • models.E020<model>.check() 类方法当前被覆盖。
  • models.E021orderingorder_with_respect_to不能一起使用。
  • models.E022<function> 包含对 <app label>.<model> 的惰性引用,但应用程序 <app label> 未安装或不提供模型 [ X135X]。
  • models.E023:模型名称 <model> 不能以下划线开头或结尾,因为它与查询查找语法相冲突。
  • models.E024:模型名称 <model> 不能包含双下划线,因为它与查询查找语法相冲突。
  • models.E025:属性 <property name> 与相关字段访问器发生冲突。
  • models.E026:该模型不能有多个字段与primary_key=True
  • models.W027<database> 不支持检查约束。
  • models.E028db_table <db_table> 被多个模型使用:<model list>
  • models.E029:索引名称 <index> 对于型号 <model> 不是唯一的。
  • models.E030:索引名称 <index> 在型号中不是唯一的:<model list>
  • models.E031:约束名称 <constraint> 对于模型 <model> 不是唯一的。
  • models.E032:约束名称 <constraint> 在模型中不是唯一的:<model list>
  • models.E033:索引名称<index>不能以下划线或数字开头。
  • models.E034:索引名称<index>不能超过<max_length>个字符。
  • models.W035db_table <db_table> 被多个模型使用:<model list>
  • models.W036<database> 不支持带条件的唯一约束。
  • models.W037: <database> 不支持有条件的索引。
  • models.W038<database> 不支持延迟唯一约束。


安全

安全检查不会使您的站点安全。 他们不审计代码,不做入侵检测,也不做任何特别复杂的事情。 相反,它们帮助执行自动化的、容易实现的清单,这可以帮助您提高站点的安全性。

其中一些检查可能不适合您的特定部署配置。 例如,如果您在负载均衡器中进行 HTTP 到 HTTPS 的重定向,不断被警告未启用 :setting:`SECURE_SSL_REDIRECT` 会很烦人。 使用 :setting:`SILENCED_SYSTEM_CHECKS` 关闭不需要的检查。

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

以下检查验证您的安全相关设置是否已正确配置:


信号

  • signals.E001: <handler> 连接到 <signal> 信号,延迟引用发送方 <app label>.<model>,但应用程序 <app label> 不是'未安装或不提供型号 <model>


模板

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


翻译

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


网址

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

  • urls.W001:您的 URL 模式 <pattern> 使用 include()route$ 结尾。 从 route 中删除美元以避免出现包括 URL 在内的问题。
  • urls.W002:您的 URL 模式 <pattern> 有一个 route/ 开头。 删除此斜线,因为它是不必要的。 如果在 include() 中针对此模式,请确保 include() 模式具有尾随 /
  • urls.W003:你的 URL 模式 <pattern> 有一个 name,包括一个 :。 删除冒号,以避免不明确的命名空间引用。
  • urls.E004:您的网址格式 <pattern> 无效。 确保 urlpatternspath() 和/或 re_path() 实例的列表。
  • urls.W005:URL 命名空间 <namespace> 不是唯一的。 您可能无法反转此命名空间中的所有 URL。
  • urls.E006:setting:`MEDIA_URL`/ :setting:`STATIC_URL` 设置必须以斜线结尾。
  • urls.E007:自定义 handlerXXX 视图 'path.to.view' 未采用正确数量的参数 (...)。
  • urls.E008:无法导入自定义handlerXXX视图'path.to.view'


contrib 应用检查

admin

管理员检查都作为 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.E013: fields[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_horizontal[n]的值指的是<field name>,不是<model>的属性。
  • admin.E020filter_vertical[n]/filter_horizontal[n]的值必须是多对多的字段。
  • admin.E021radio_fields的值必须是字典。
  • admin.E022radio_fields的值指的是<field name>,不是<model>的属性。
  • admin.E023radio_fields的值指的是<field name>,不是ForeignKey的实例,也没有[ X128X]定义。
  • 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>,不能是DateTimeFieldForeignKey、[ X111X] 或 ManyToManyField 字段。
  • 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>的属性。
  • admin.E036autocomplete_fields的值必须是列表或元组。
  • admin.E037autocomplete_fields[n]的值指的是<field name>,不是<model>的属性。
  • admin.E038autocomplete_fields[n]的值必须是外键或多对多字段。
  • admin.E039:必须注册模型 <model> 的管理员才能被 <modeladmin>.autocomplete_fields 引用。
  • admin.E040: <modeladmin> 必须定义 search_fields,因为它被 <other_modeladmin>.autocomplete_fields 引用。

ModelAdmin

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

  • admin.E101save_as 的值必须是布尔值。
  • admin.E102save_on_top 的值必须是布尔值。
  • admin.E103inlines的值必须是列表或元组。
  • admin.E104: <InlineModelAdmin class> 必须继承自 InlineModelAdmin
  • 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>,不是指一个Field。
  • 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>,不是指一个Field。
  • admin.E128date_hierarchy的值必须是DateFieldDateTimeField
  • admin.E129<modeladmin> 必须为 <action> 动作定义一个 has_<foo>_permission() 方法。
  • admin.E130<modeladmin>中定义的动作的__name__属性必须是唯一的。 名称 <name> 不是唯一的。


InlineModelAdmin

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

  • admin.E201:不能排除字段<field name>,因为它是父模型<app_label>.<model>的外键。
  • admin.E202: <model> 没有 ForeignKey<parent model>./ <model> 有多个 ForeignKey<parent model>。 您必须指定 fk_name 属性。
  • 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> 没有 GenericForeignKey 使用内容类型字段 <field name> 和对象 ID 字段 <field name>


AdminSite

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


auth

  • auth.E001: REQUIRED_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 必须是属性或属性而不是方法。 忽略这是一个安全问题,因为匿名用户将被视为经过身份验证!
  • auth.E011:型号<model>的名称最多为93个字符,其内置权限名称最多为100个字符。
  • auth.E012:型号<model>的权限代号为<codename>超过100个字符。


contenttypes

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

  • contenttypes.E001GenericForeignKey 对象 ID 引用了不存在的字段 <field>
  • contenttypes.E002GenericForeignKey 内容类型引用了不存在的字段 <field>
  • contenttypes.E003<field> 不是 ForeignKey
  • contenttypes.E004<field> 不是 ForeignKeycontenttypes.ContentType
  • contenttypes.E005:模型名称不得超过 100 个字符。


postgres

django.contrib.postgres 模型字段执行以下检查:

  • postgres.E001:数组的基字段有错误:…
  • postgres.E002:数组的基本字段不能是相关字段。
  • postgres.E003: <field> 默认应该是一个可调用的而不是一个实例,这样它就不会在所有字段实例之间共享。 此项检查在Django 3.1中更改为 fields.E010


sites

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

  • sites.E001CurrentSiteManager 找不到名为 <field name> 的字段。
  • sites.E002: CurrentSiteManager 不能使用 <field>,因为它不是外键或多对多字段。


staticfiles

以下检查验证 django.contrib.staticfiles 是否正确配置: