系统检查框架是一组用于验证Django项目的静态检查。 它检测常见问题并提供如何修复它们的提示。 框架是可扩展的,因此您可以轻松添加自己的检查。
有关如何添加自己的检查并将其与Django的系统检查集成的详细信息,请参阅System check topic guide。
CheckMessage
¶系统检查引起的警告和错误必须是CheckMessage
的实例。 一个实例封装了一个可报告的错误或警告。 它还提供适用于消息的上下文和提示,以及用于过滤目的的唯一标识符。
构造函数的参数是:
水平
DEBUG
,
INFO
, WARNING
, ERROR
, CRITICAL
. 如果该级别大于等于ERROR
,则Django将阻止管理命令执行。 低于ERROR
的消息(即警告)将报告给控制台,但可以静音。味精
暗示
None
的值。OBJ
__str__
方法的任何其他对象(在Python 2上需要定义__unicode__
方法)。 该方法在报告所有消息时使用,其结果位于消息之前。ID
applabel.X001
, where X
is one of the letters
CEWID
, indicating the message severity (C
for criticals, E
for
errors and so). 该号码可以由应用程序分配,但在该应用程序中应该是唯一的。有一些子类使得创建具有共同级别的消息更容易。 使用它们时,您可以省略level
参数,因为它是由类名隐含的。
Django的系统检查使用以下标记进行组织:
admin
:检查任何管理网站声明。caches
:检查缓存相关配置。compatibility
:标记版本升级的潜在问题。database
:检查数据库相关的配置问题。 数据库检查不会默认运行,因为它们比常规检查执行的静态代码分析更多。 它们仅由migrate
命令运行,或者在调用check
命令时指定database
标记。models
:检查模型,字段和管理器定义。security
:检查安全相关的配置。signals
:检查信号声明和处理程序注册。templates
:检查模板相关配置。urls
:检查URL配置。某些检查可能会向多个标签注册。
执行以下检查以警告用户由于版本升级可能发生的任何潜在问题。
BooleanField
没有默认值。 由于误报,此检查在Django 1.8中已删除。MIDDLEWARE_CLASSES。
django.contrib.sessions.middleware.SessionMiddleware
,django.contrib.auth.middleware.AuthenticationMiddleware
和django.contrib.messages.middleware.MessageMiddleware
如果你的项目需要这些中间件,那么你应该配置这个设置。 此检查已在Django 1.9中删除。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
.MIDDLEWARE_CLASSES
设置,而MIDDLEWARE
设置优先。 由于您设置了MIDDLEWARE
,所以忽略MIDDLEWARE_CLASSES
的值。如果您使用MySQL,将执行以下检查:
max_length
具有CharField
> 255。"__"
。pk
是不能用作字段名称的保留字。choices
必须是可迭代的(例如,列表或元组)。choices
必须是可迭代的(实际 值 / t6> 可读 名称)
元组。None
必须是False
,db_index
或True
。null=True
。AutoField
必须设置primary_key = True。BooleanField
不接受空值。max_length
必须定义CharField
属性。max_length
必须为正整数。IntegerField
与max_length
配合使用时将被忽略。decimal_places
必须定义DecimalField
属性。decimal_places
必须是非负整数。max_digits
必须定义DecimalField
属性。max_digits
必须是非负整数。decimal_places
必须大于或等于max_digits
。allow_files
必须将FilePathField
或allow_folders
设置为True。GenericIPAddressField
不能接受空值,如果不允许空值,因为空值存储为null。auto_now_add
,auto_now
和default
是互斥的。 这些选项中只能有一个存在。IPAddressField
已被删除,除了历史迁移中的支持。IPAddressField
已被弃用。 对它的支持(除了历史迁移)将在Django 1.9中删除。 这个检查出现在Django 1.7和1.8中。CommaSeparatedIntegerField
。 对Django 2.0的支持(在历史迁移中除外)将被删除。FileField
不是unique
的有效参数。
此检查在Django 1.11中删除。FileField
不是primary_key
的有效参数。FileField
的upload_to
参数必须是相对路径,而不是绝对路径。ImageField
。app_label.app_name
的格式不是<swappable>
。<model>
引用<SETTING>
<app_label>.<model>
具有两个多对多关系。primary_key=True
只能用作字段名称,如果字段也设置为id
。<field name>
from parent model <model>
clashes with the field <field name>
from parent model <model>
.<field name>
from model
<model>
.&lt;字段 名称&gt;
列名称&lt;列 name&gt;
被另一个字段使用。index_together
必须是列表或元组。index_together
元素必须是列表或元组。unique_together
必须是列表或元组。unique_together
元素必须是列表或元组。index_together/unique_together
是指不存在的字段&lt; field name&gt;
。index_together/unique_together
是指ManyToManyField
&lt; field name&gt;
,但是该选项不支持ManyToManyField
。ordering
必须是元组或列表(即使您只想按照一个字段排序)。ordering
是指不存在的字段&lt; field name&gt; T3>。
index_together/unique_together
refers to field
<field_name>
which is not local to model <model>
.<model>
包含模型字段。<field>
,自动生成的列名称过长。
数据库<alias>
的最大长度为 长度
。&lt; M2M 字段>
的自动生成列名太长。 数据库<alias>
的最大长度为 长度
。<model>.check()
类方法当前被覆盖。ordering
和order_with_respect_to
不能一起使用。<function>
包含对&lt; app 标签&gt;的延迟引用。&lt; model&gt;
,但app &lt; app 标签&gt;
未安装或不提供模型<model>
<model>
无法以下划线开始或结束,因为它与查询查询语法相冲突。<model>
不能包含双下划线,因为它与查询查询语法相冲突。安全检查不会使您的网站安全。 他们不审计代码,做入侵检测,或做任何特别复杂的事情。 相反,他们帮助执行自动化,低挂的水果清单。 它们可以帮助您记住提高网站安全性的简单操作。
其中一些检查可能不适合您的特定部署配置。 例如,如果您在负载平衡器中执行HTTP到HTTPS重定向,则会不经常警告您未启用SECURE_SSL_REDIRECT
。 使用SILENCED_SYSTEM_CHECKS
可停止不需要的检查。
如果您使用check --deploy
选项,则运行以下检查:
MIDDLEWARE
/ MIDDLEWARE_CLASSES
中没有django.middleware.security.SecurityMiddleware
,所以SECURE_HSTS_SECONDS
,SECURE_CONTENT_TYPE_NOSNIFF
,SECURE_BROWSER_XSS_FILTER
和SECURE_SSL_REDIRECT
设置将无效。MIDDLEWARE
/ MIDDLEWARE_CLASSES
中没有django.middleware.clickjacking.XFrameOptionsMiddleware
,所以您的网页将不会提供'x-frame-options'
标题。 除非您的网站有足够的理由在框架中投放,否则您应该考虑启用此标头以帮助防止点击劫持攻击。django.middleware.csrf.CsrfViewMiddleware
不在您的MIDDLEWARE
/ MIDDLEWARE_CLASSES
)。 启用中间件是确保您不留下任何漏洞的最安全的方法。SECURE_HSTS_SECONDS
设置设置值。 如果您的整个网站仅通过SSL投放,您可以考虑设置值并启用HTTP
Strict Transport Security。 请务必先阅读文档;使HSTS不小心会导致严重的,不可逆的问题。SECURE_HSTS_INCLUDE_SUBDOMAINS
设置设置为True
。 否则,您的网站可能容易受到通过与子域的不安全连接的攻击。 如果您确定域的所有子域都应通过SSL专门投放,则只需将其设置为True
即可。SECURE_CONTENT_TYPE_NOSNIFF
设置未设置为True
,因此您的网页将不会提供
“X-内容类型的选项: nosniff”
头。 您应该考虑启用此标头,以防止浏览器不正确地识别内容类型。SECURE_BROWSER_XSS_FILTER
设置未设置为True
,因此您的网页将不会提供
“X-XSS-保护: 1; 模式=块”
头。 您应该考虑启用此标头来激活浏览器的XSS过滤,并帮助防止XSS攻击。SECURE_SSL_REDIRECT
设置未设置为True
。 除非您的网站应通过SSL和非SSL连接提供,否则您可能要将此设置设置为True
,或者配置负载平衡器或反向代理服务器将所有连接重定向到HTTPS。SECRET_KEY
少于50个字符或少于5个唯一字符。 请生成一个长且随机的SECRET_KEY
,否则许多Django的安全关键功能将容易受到攻击。django.contrib.sessions
in your
INSTALLED_APPS
but you have not set
SESSION_COOKIE_SECURE
to True
. 使用安全的会话cookie使得网络流量嗅探器更难以劫持用户会话。MIDDLEWARE
/ MIDDLEWARE_CLASSES
中有django.contrib.sessions.middleware.SessionMiddleware
,但是您尚未将SESSION_COOKIE_SECURE
设置为True
。 使用安全的会话cookie使得网络流量嗅探器更难以劫持用户会话。SESSION_COOKIE_SECURE
未设置为True
。
使用安全的会话cookie使得网络流量嗅探器更难以劫持用户会话。INSTALLED_APPS
中有django.contrib.sessions
,但尚未将SESSION_COOKIE_HTTPONLY
设置为True
。 使用HttpOnly
会话Cookie会使跨站点脚本攻击更难以劫持用户会话。MIDDLEWARE
/ MIDDLEWARE_CLASSES
中有django.contrib.sessions.middleware.SessionMiddleware
,但是您尚未将SESSION_COOKIE_HTTPONLY
设置为True
。 使用HttpOnly
会话Cookie会使跨站点脚本攻击更难以劫持用户会话。SESSION_COOKIE_HTTPONLY
未设置为True
。
使用HttpOnly
会话Cookie会使跨站点脚本攻击更难以劫持用户会话。CSRF_COOKIE_SECURE
未设置为True
。
使用安全的CSRF cookie使得网络流量嗅探器更难窃取CSRF令牌。CSRF_COOKIE_HTTPONLY
未设置为True
。
使用HttpOnly
CSRF Cookie使跨站点脚本攻击更难窃取CSRF令牌。 此检查在Django 1.11中作为删除 CSRF_COOKIE_HTTPONLY
设置不提供实际的好处。DEBUG
设置为True
。MIDDLEWARE
/ MIDDLEWARE_CLASSES
中有django.middleware.clickjacking.XFrameOptionsMiddleware
,但X_FRAME_OPTIONS
未设置为'DENY'
。 默认值为'SAMEORIGIN'
,但除非您的网站有足够的理由在框架中为其自身的其他部分提供服务,否则应将其更改为'DENY'
。ALLOWED_HOSTS
在部署中不能为空。SECURE_HSTS_PRELOAD
设置设置为True
。 否则,您的网站无法提交到浏览器预加载列表。<handler>
连接到<signal>
信号,对发送方&lt; app 标签&gt;。&lt; model&gt;
,但app &lt; app label&gt; t10 >
未安装或不提供模型<model>
。对您的URL配置执行以下检查:
<pattern>
uses
include()
with a regex
ending with a
$
. 从regex
中删除美元,以避免包含URL的问题。<pattern>
具有以/
开头的regex
。 删除这个斜杠是不必要的。
如果在include()
中定位了此模式,请确保include()
模式具有尾部/
。<pattern>
具有name
,包括 :
. 删除冒号,以避免不明确的命名空间引用。<pattern>
无效。 确保urlpatterns
是url()
实例的列表。<namespace>
不是唯一的。 您可能无法撤销此命名空间中的所有URL。MEDIA_URL
/ STATIC_URL
设置必须以斜杠结尾。contrib
app check ¶admin
¶管理员检查全部作为admin
标记的一部分执行。
对在管理站点注册的任何ModelAdmin
(或子类)执行以下检查:
raw_id_fields
的值必须是列表或元组。raw_id_fields[n]
的值是指&lt; field name&gt; / t3>,它不是<model>
的属性。
raw_id_fields[n]
的值必须是外键或多对多字段。fields
必须是列表或元组。fields
和fieldsets
。fields
包含重复字段。fieldsets
的值必须是列表或元组。fieldsets[n]
的值必须是列表或元组。fieldsets[n]
的值必须为2。fieldsets[n][1]
的值必须是字典。fields
的值必须包含键fieldsets[n][1]
。fieldsets[n][1]
中有重复字段。ManyToManyField
不能包含fields[n]/fieldsets[n][m]
&lt; field name&gt;
,因为该字段手动指定关系模型。exclude
的值必须是列表或元组。exclude
的值包含重复字段。BaseModelForm
的值必须继承form
。filter_vertical
的值必须是列表或元组。filter_horizontal
的值必须是列表或元组。filter_vertical[n]/filter_vertical[n]
的值是指&lt; field name&gt;
,它不是<model>
的属性。filter_vertical[n]/filter_vertical[n]
的值必须是多对多字段。radio_fields
的值必须是字典。radio_fields
的值是指&lt; field name&gt;
,其不是<model>
的属性。radio_fields
的值指的是&lt; field name&gt;
,其不是choices
,并且没有ForeignKey
定义。radio_fields [&lt; field name&gt;]
的值必须是admin.HORIZONTAL
或admin.VERTICAL
。view_on_site
的值必须是可调用值或布尔值。prepopulated_fields
的值必须是字典。prepopulated_fields
的值指向&lt; field name&gt;
,其不是<model>
的属性。prepopulated_fields
的值是指&lt; field name&gt;
,它不能是DateTimeField
,ForeignKey
,OneToOneField
或ManyToManyField
字段。prepopulated_fields [&lt; field name&gt;]
的值必须是列表或元组。prepopulated_fields
的值是指&lt; field name&gt;
,它不是<model>
的属性。ordering
的值必须是列表或元组。ordering
的值具有随机排序标记
?
,但也包含其他字段。ordering
的值指的是&lt; field name&gt;
,其不是<model>
的属性。readonly_fields
的值必须是列表或元组。readonly_fields[n]
的值不是可调用的,属性&lt; ModelAdmin class&gt ;
或属性<model>
。ModelAdmin
¶对在管理站点注册的任何ModelAdmin
执行以下检查:
save_as
的值必须是布尔值。save_on_top
的值必须是布尔值。inlines
的值必须是列表或元组。&lt; InlineModelAdmin class&gt;
必须继承自InlineModelAdmin
。&lt; InlineModelAdmin class&gt;
必须具有model
属性。&lt; InlineModelAdmin class&gt; .model
的值必须为Model
list_display
的值必须是列表或元组。<label>
的值是指list_display[n]
,不是可调用的,属性 &lt; ModelAdmin class&gt;
或<model>
上的属性或方法。list_display[n]
的值不能是ManyToManyField
字段。None
的值必须是列表,元组或list_display_links
。list_display_links[n]
refers to <label>
,
which is not defined in list_display
.list_filter
的值必须是列表或元组。ListFilter
的值必须继承list_filter[n]
。FieldListFilter
的值不能继承list_filter[n]
。FieldListFilter
的值必须继承list_filter[n][1]
。<label>
的值指的是不参考字段的list_filter[n]
。list_select_related
的值必须是布尔值,元组或列表。list_per_page
的值必须为整数。list_max_show_all
的值必须为整数。list_editable
的值必须是列表或元组。<label>
的值指代list_editable[n]
,其不是<model>
。list_editable[n]
的值是<label>
,它不包含在list_display
list_editable
的值不能同时位于list_editable[n]
和list_display_links
中。list_editable[n]
refers to the first field
in list_display
(<label>
), which cannot be used unless
list_display_links
is set.list_editable[n]
的值指向&lt; field name&gt; / t3>,这是不能通过管理员编辑。
search_fields
的值必须是列表或元组。date_hierarchy
的值是&lt; field name&gt;
,它不是指现场。DateField
的值必须是date_hierarchy
或DateTimeField
。InlineModelAdmin
¶对在ModelAdmin
上注册为内联的任何InlineModelAdmin
执行以下检查。
&lt; field name&gt;
,因为它是父模型<app_label>.<model>
。<model>
has no ForeignKey
to <parent model>
./
<model>
has more than one ForeignKey
to <parent model>
.extra
的值必须为整数。max_num
的值必须为整数。min_num
的值必须为整数。BaseModelFormSet
的值必须继承formset
。GenericInlineModelAdmin
¶对在ModelAdmin
上注册为内联的任何GenericInlineModelAdmin
执行以下检查。
<label>
参考'ct_field'
,不是<model>
<label>
参考'ct_fk_field'
,不是<model>
GenericForeignKey
没有<model>
。<model>
has no GenericForeignKey
using content type
field <field name>
and object ID field <field name>
.AdminSite
¶在默认的AdminSite
上执行以下检查:
django.contrib.contenttypes
必须在INSTALLED_APPS
中才能使用管理应用程序。django.contrib.auth.context_processors.auth
必须在TEMPLATES
中才能使用管理应用程序。auth
¶REQUIRED_FIELDS
必须是列表或元组。REQUIRED_FIELDS
的字段不能包含在USERNAME_FIELD
中。USERNAME_FIELD
必须是唯一的,因为它被命名为<field>
。USERNAME_FIELD
命名为<field>
,但不是唯一的。<codename>
的权限与模型<model>
的内置权限冲突。<codename>
的权限对于模型<model>
重复。<model>
的verbose_name
的内置权限名称最多不得超过244个字符,最多为255个字符。<model>
的名为<name>
的权限长于255个字符。&lt; User model&gt; .is_anonymous
必须是属性或属性而不是方法。 忽略这是一个安全问题,因为匿名用户将被视为已验证!&lt; User model&gt; .is_authenticated
必须是属性或属性而不是方法。 忽略这是一个安全问题,因为匿名用户将被视为已验证!contenttypes
¶当模型包含GenericForeignKey
或GenericRelation
时,将执行以下检查:
<field>
对象ID引用不存在的字段GenericForeignKey
。<field>
内容类型引用不存在的字段GenericForeignKey
。ForeignKey
不是<field>
。ForeignKey
不是<field>
至contenttypes.ContentType
。sites
¶使用CurrentSiteManager
在任何模型上执行以下检查:
CurrentSiteManager
找不到名为的字段&lt; field name&gt; t3 >。
CurrentSiteManager
不能使用<field>
,因为它不是外键或多对多字段。2017年9月6日