2019年12月2日,Django官方博客发布了Django 3.0的
发布说明
,Django 3.0 正式版真的来啦!
Django是一款用于开发Web应用程序的高级Python框架,Pinterest,Instagram和NASA等网站都是使用该框架来编写的。虽然Django一直占据着Python Web开发界的头把交椅,但其不支持异步一直困扰着开发者,而Django 3.0正式版本终于支持ASGI了,这不免让开发者兴奋。
Django 3.0的新功能
除了前文提到的支持ASGI,Django 3.0还涵盖了很多新的功能,下面我们就详细解读一下这些新功能。
Python版本支持
Django对Python版本的支持一向是很积极的,Django 3.0只支持Python 3.6以上的版本,即Python 3.6、3.7和3.8,Django 2.2.X系列成为了最后一个支持Python 3.5的系列。
数据库支持
Django 3.0在数据库支持方面的最大亮点是正式支持了Maria开发DB 10.1及更高版本。对于开发者来说,又多了一种数据库选择,且MariaDB与MySQL类似,但是存储引擎类型更多,查询效率更快。
在支持新数据库的同时,Django 3.0版本也放弃了对某些数据库版本的支持。2019年12月,Django将结束对PostgreSQL 9.4的上游支持,转而支持PostgreSQL 9.5及更高版本;2021年7月将结束对Oracle 12.1的上游支持,正式支持Oracle 12.2和18c。另外,需要注意的是,Django 2.2对Oracle 12.1的支持也将在2022年4月结束。
ASGI支持
ASGI支持可以说是开发者最期待的Django 3.0的新功能。ASGI是异步网关协议接口,是介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket。
Django 3.0对ASGI模式的支持使得Django 可以作为原生异步应用程序运维,原有的WSGI模式将围绕每个Django调用运行单个事件循环,以使异步处理层与同步服务器兼容。
在这个改造的过程中,每个特性都会经历以下三个实现阶段:
-
Sync-only,只支持同步,也就是当前的情况
-
Sync-native,原生同步,同时带有异步封装器
-
Async-native,原生异步,同时带同步封装器
需要注意的是,在异步事件循环时,Django会阻止调用异步上下文中标记为“async unsafe”的代码,例如ORM操作。如果直接使用异步代码之前的Django,那么很可能就会触发这个问题,如果发生了SynchronousOnlyOperation错误,需要仔细检查代码并将所有数据库操作移至同步子线程中。
PostgreSQL的排斥约束
新ExclusionConstraint类允许在PostgreSQL上添加排除约束。使用Meta.constraints选项将约束添加到模型 。
模型字段选择的枚举
Django 3.0可以自定义枚举类型TextChoices、IntegerChoices和Choices来定义Field.choices。其中,TextChoices和IntegerChoices类型用于文本和整数字段,Choices类允许定义其他具体数据类型的兼容枚举。
以上这些自定义枚举类型几乎包含了所有用户可读的标签,同时可以通过枚举或者成员的属性来翻译和访问这些标签。更多详细信息和示例,请参见
枚举类型
。
不再支持的功能
除了增加新功能,Django 3.0版本也弃用了一些旧功能,包括但不限于:
-
django.db.backends.postgresql_psycopg2模块
-
django.shortcuts.render_to_response()
-
DEFAULT_CONTENT_TYPE设置
-
HttpRequest.xreadlines()
-
支持context的Field.from_db_value()和 Expression.convert_value()
-
field_name的关键字参数QuerySet.earliest()和 latest()
-
ForceRHRGIS功能
-
django.utils.http.cookie_date()
-
staticfiles和admin_static的模板标签库
-
django.contrib.staticfiles.templatetags.staticfiles.static;
版本兼容性问题
Django 3.0发布之后,很多开发者都会关心Django 3.0对之前版本的兼容性。官方给出的建议是:第三方应用程序的开发者最好放弃使用Django 2.2之前的版本。开发者可以使用 python -Wd 运行包进行测试,如果出现了弃用警告,那么就要及时修复,以便应用程序能够与Django 3.0兼容。
除了版本兼容问题,关于数据库后端、安全、默认值等具体兼容性问题,可以查看
此处
。