1.3 Django 3.0的新特性
Django 3.0沿用了Django 2.0诸多特性,但也对一些方面进行了适当的调整,形成了3.0版本独有的特性。Django 3.0与Django 2.0的不同之处主要在于以下十几个方面。
1. Python兼容性
Django 3.0与Django 3.1支持Python 3.6、Python 3.7与Python 3.8,Django 2.2.x会是最后一个支持Python 3.5及更早版本的系列。对于第三方Django应用,官方建议应用开发者放弃对Django 2.2及更早版本的支持。
2. ASGI的支持
新增对ASGI的支持,让Django逐渐支持异步功能。这是Django对现有Web服务器网关接口(Python Web Server Gatway Interface,WSGI)模式支持的补充。
3. 数据库支持
支持使用MariaDB 10.1或更高版本的数据库。不再支持PostgreSQL 9.4版本,只支持PostgreSQL 9.5及以上版本。2021年不再支持Oracle 12.1版本,只支持Oracle 12.2及以上版本。
4. PostgreSQL的排斥约束
增加了类django.contrib.postgres.constraints.ExclusionConstraint,用来在数据库PostgreSQL上添加排除约束。使用Meta.constraints选项将定义的约束添加到模型。
5. 过滤器表达式
表达式输出结果为BooleanField类型的值,可以直接在QuerySet过滤器中使用,而不必先注释,再针对注释进行过滤。
6. 用于选择字段的枚举类
增加了模型关联的类TextChoices、IntegerChoices和Choices,这些类可用于定义Field.choices。其中为文本和整数字段提供了TextChoices类型和IntegerChoices类型。在Choices类允许定义为其他具体的数据类型兼容的枚举。
7. 缓存控制
在缓存控制方法patch_cache_control()中增加private标识的判断逻辑,该方法被add_never_cache_headers调用。在缓存控制方法patch_cache_control()中增加no-cache标识的判断逻辑,该方法被cache_control调用(Django 3.1新增功能)。
8. 文件存储管理
提供了django.core.files.storage.Storage.get_alternative_name()方法,用来根据已有文件名随机生成一个新文件名称。在一定程度上避免因多次上传同名文件而带来的存储影响。django.core.files.storage. FileSystemStorage的save()方法采用pathlib.Path类的路径解析(Django 3.1新增功能)。
9. 表单管理
表单管理是Django使用Forms的重要形式,在Django 3.0中有如下调整:
- 在表单的基础类中添加了can_order属性,该属性默认为False;当该属性为True时,可在表单页面中增加排序属性。默认情况下排序属性以数值形式体现,用户可通过修改属性ordering_widget或重写基类方法get_ordering_widget()来改变页面中排序属性的显示形式。
- 调整类django.forms.ModelChoiceIterator的choice()方法,使该方法以django.forms.ModelChoiceIteratorValue实例形式返回。类django.forms.ModelChoiceIterator用于表单字段ModelChoiceField和ModelMultipleChoiceField(Django 3.1新增功能)。
- 表单字段DateTimeField(django.forms.DateTimeField)支持ISO 8601时间格式传递,接收配置节点DATE_INPUT_FORMATS与DATETIME_INPUT_FORMATS的信息并将字段信息转换为时间值(Django 3.1新增功能)。
- 调整类django.forms.MultiWidget的初始传入参数widgets,使该参数可传递自定义的subwidget字典信息(Django 3.1新增功能)。调整类django.forms.BoundField,增加属性widget_type,用于根据属性值动态调整表单显示信息(Django 3.1新增功能)。
10. 语言国际化
在语言国际化使用方面,Django 3.0有如下调整:
- 增加配置节点LANGUAGE_COOKIE_HTTPONLY,用来为语言cookie设置HttpOnly标志,该节点默认为False。当设置为True时,客户端JavaScript脚本将被禁止访问语言cookie。
- 增加配置节点LANGUAGE_COOKIE_SAMESITE,用来为语言cookie设置SameSite标志,该节点默认为None(Django 3.1新增功能),表示语言cookie可被跨站点请求发送。
- 增加配置节点LANGUAGE_COOKIE_SECURE,用来为语言cookie增加安全访问控制,该节点默认为False。当设置为True时,标识只有在HTTPS连接时才会发送语言cookie。
- 添加了对乌兹别克语、阿尔及利亚阿拉伯语、伊博语、吉尔吉斯语、塔吉克语、土库曼语的支持和翻译(Django 3.1新增功能)。
11. 日志管理
为类django.utils.log.AdminEmailHandler增加属性reporter_class,该属性值为django.views.debug.ExceptionReporter子类的名称标识信息,该属性值用来自定义错误回溯格式。设置了此属性后,当配置节点Debug设置为False,Admin站点发生异常时,将按照自定义错误回溯格式向页面反馈信息。
12. 针对诸多管理命令进行的调整
对于框架管理命令,Django 3.0做了如下调整:
- 调整了命令的使用方式。调整了命令showmigrations,使该命令在参数verbosity值为2或3时,使用参数list将会显示应用时间信息;命令dbshell增加了对PostgreSQL数据库的客户端TLS证书的支持;命令inspectdb会在字段外键存在唯一性或者受主键约束时,对类型为OneToOneField进行自我核查;命令startapp与startproject的template参数支持存放形式为XZ的档案(.tar.xz、.txz)和形式为LZMA的档案(.tar.lzma、.tlz)。
- 增加了命令的参数。为命令compilemessages增加了参数ignore,用于忽略对指定文件夹扫描编译文件;为命令check增加了参数database,用于指定数据库别名进行数据库检测(Django 3.1新增功能);为命令migrate增加了参数check,用于在数据迁移时检测是否存在未应用的迁移脚本,如果存在,则退出生成数据库对象(Django 3.1新增功能);为命令check增加了特别参数判断,以“--”分隔符作为判断依据,可根据不同数据库客户端设置不同的连接参数(Django 3.1新增功能);增加了所有命令的通用参数skip-checks,用来跳过运行命令之前正在运行的系统检查。
- 为通用命令异常类django.core.management.CommandError增加初始化参数returncode,该参数用于自定义命令的退出状态(Django 3.1新增功能)。
13. 模型扩展
对于模型的使用,Django 3.0做了如下调整:
- 增加了各类函数。增加了MD5函数,用于将文本类型字段或表达式转换为基于MD5的散列字符串;增加了SHA1函数,用于将文本类型字段或表达式转换为基于SHA1的散列字符串;增加了SHA224函数,用于将文本类型字段或表达式转换为基于SHA224的散列字符串,需要注意的是,该函数不适用于Oracle数据库;增加了SHA256函数,用于将文本类型字段或表达式转换为基于SHA256的散列字符串;增加了SHA384函数,用于将文本类型字段或表达式转换为基于SHA384的散列字符串;增加了SHA512函数,用于将文本类型字段或表达式转换为基于SHA512的散列字符串;增加了Sign函数,用于以(-1,0,1)形式返回数值类型字段或表达式的符号;为模型基础类django.db.backends.base.BaseDatabaseFeatures增加了方法allows_group_by_selected_pks_on_model(),该方法允许对子句进行优化,默认情况下,该方法仅适用于PostgreSQL数据库;增加了字段类型JSONField,用于json字符串的编码与解码(Django 3.1新增功能);新增时间方法ExtractIsoWeekDay,用ISO-8601标准提取DateField和DateTimeField类型数据的星期值(Django 3.1新增功能);新增查询方法iso_week_day(),该方法可在查询结果集中按照ISO-8601形式返回星期值(Django 3.1新增功能);为类django.db.models.Combinable增加方法bitxor()用于位的异或操作,该类被django.db.models.F、django.db.models.Expression继承。
- 增加了函数参数。为函数Trunc增加了is_dst参数,用来设置不存在和不明确的日期时间的处理方式;增加了使用connection.queries时的输出结果,当使用PostgreSQL数据库时,可以根据调用情况显示类似“COPY xx TO xxx”的SQL脚本信息;为类django.db.models.query.QuerySet的datetimes()方法增加了参数is_dst,用于处理传递不存在或模糊的时间信息(Django 3.1新增功能)。
- 增加了字段。增加了字段类型PositiveBigIntegerField,它的行为与字段类型PositiveIntegerField类似,其取值范围为0~9223372036854775807(Django 3.1新增功能)。增加了字段类型SmallAutoField,它的行为与字段类型AutoField类似,其取值范围为1~32767。
- 调整了字段。调整了模型字段FilePathField,使该字段的参数path可接受方法的返回值;将具有对称性的中间表用于模型字段ManyToManyField的自引用;增加模型CheckConstraint、UniqueConstraint和Index的参数使用控制,允许参数name使用以'%(app_label)s'和'%(class)s'占位符形式体现的字符串;为模型字段基类Field增加属性descriptor_class,用来形成描述信息;模型统计函数Avg与Sum允许对带有distinct行为的数据集合进行统计;调整字段类型BigAutoField的继承父类为BigIntegerField,调整字段类型SmallAutoField的继承父类为SmallIntegerField;为字段类型FileField增加属性upload_to,该属性可用于保存文件的路径信息,并可用于pathlib.Path类的实例传递。调整模型字段FileField(作为继承类,ImageField也受影响)的初始参数storage,使该参数接收可调用方法,便于动态调整storage(Django 3.1新增功能)。
在字段方面,Django 3.1版本中又新增了如下功能。
- 增加了模型的CheckConstraint参数check使用控制,允许使用布尔表达式形式作为传入参数。
- 增加了模型的UniqueConstraint参数deferrable使用控制,允许创建延迟性唯一性约束。
- 为模型字段OneToOneField以及外键字段ForeignKey的on_delete参数增加了RESTRICT选项值,用户可在删除该类字段数据时,根据需要选择model.CASCADE、model.PROTECT与model.RESTRICT。
14. 请求响应
对于页面的请求响应处理,Django 3.0做了如下调整:
- 调整了请求相应的传递信息。为HttpResponse的传递内容信息增加了memoryview格式,用于返回。调整HttpRequest.headers的传递信息,允许以下划线和连字符两种形式查找相关关键字,这两种查询内容一致,例如查询user_agent与user-agent,最后查询的都是user-agent。
- 调整了请求相应的调用方法。调整了类django.http.HttpResponse中的方法set_cookie()与set_signed_cookie(),设置参数samesite默认值为None,用来表示cookie可被用于跨站请求,可根据需要禁止(Django 3.1新增功能)。为类django.http.HttpResponse增加方法accepts(),用来根据Accept标头信息接收相关类型的内容(Django 3.1新增功能)。
15. 安全管理
在安全管理方面,Django 3.0做了如下调整:
- 调整配置节点X_FRAME_OPTIONS的默认值为“DENY”。
- 调整配置节点SECURE_CONTENT_TYPE_NOSNIFF的默认值为“True”,当该值为“True”时,安全中间件SecurityMiddleware将为Web响应设置X-Content-Type-Options: nosniff标头信息。
- 调整配置节点SECURE_REFERRER_POLICY的默认值为“same-origin”,当该值为“same-origin”时,安全中间件SecurityMiddleware将设置Referrer Policy标头信息结果为“same-origin”。如果需要改变初始Referrer Policy标头信息,需要修改配置节点SECURE_REFERRER_POLICY为“None”(Django 3.1新增功能)。
16. 测试管理
对于模块测试,Django 3.0做了如下调整:
- 增加了测试使用的参数。为类django.test.Client增加了初始参数raise_request_exception,用来控制在请求中发生的异常后是否能在测试中显示,该值默认为True,即向后兼容。如果将该值设置为False,则如果在请求过程中发生异常,在测试中将显示为“500”响应异常。当采用selenium方式进行测试时,提供了headless参数进行无标题信息测试。为类django.test.SimpleTestCase增加了配置参数migrate用来设置是否生成测试数据库(Django 3.1新增功能)。
- 调整了测试框架命令。为框架命令Test增加了k参数,用来选择运行匹配相应字符串的方法或类;为框架命令Test增加了pdb参数,用来对错误进行debug跟踪(需要安装pdb包)。为框架命令Test增加了buffer参数,用来丢弃通过测试的输出信息(Django 3.1新增功能)。
- 增加了测试方法。为类django.test.SimpleTestCase增加方法debug用来错误调试(debug)(Django 3.1新增功能)。