Django3.0 前瞻 支持异步通信
最近两年,Django的版本号提升得特别快,2.0还没有多久,很快就要到3.0了。
让我们先看看官方的路线图和时间表:

| 版本号 | 发布日期 | 停止更新日期 | 停止维护日期 |
|---|---|---|---|
| 3.0 | 2019-12 | 2020-08 | 2021-04 |
| 3.1 | 2020-08 | 2021-04 | 2021-12 |
| 3.2 LTS | 2021-04 | 2021-12 | 2024-04 |
可以看到2019年12月即将发布3.0,2022年升级为4.0,但我们感觉2.2还在昨天。
这给广大的使用者和学习者带来了一定的学习压力和升级成本,但同时也代表Django的生态圈非常健康,使用者稳步上升,功能迭代迅速,是一种好的现象,我们要积极拥抱变化,拒绝落后。
接下来,让我们看看3.0究竟有哪些新东西和新变化。
Python兼容性
不再支持3.6以下版本,仅支持3.6、3.7、3.8或者更高版本。
(按照Django的一贯策略,最新的Django请使用最新的python。)
ASGI
这是Django3.0最大的变化和提升!
通过支持ASGI,Django3.0开始具备全双工的异步通信能力,解决其最大的短板,不再被人诟病!(Tornado的支持者拿这个说事已经不是一天两天了)
支持ASGI并不是取代现有的WSGI,而是一种补充,也就是说我们现在有两种服务器运行模式了。
要注意的是,只有在启动了基于ASGI的服务器之后,才支持异步通信功能。在ASGI模式下,同时支持异步和同步通信。(WSGI模式下只能同步通信)
Django官方提供了一份部署ASGI的文档https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/,值得学习一下。
ASGI的引入也带来了一些需要注意的事项:Django现在会监视异步事件循环,并阻止你从异步上下文中调用被标记为异步不安全的代码,比如ORM操作(注意,这不是说ORM不能用了)。如果你遇到SynchronousOnlyOperation错误,请仔细检查代码并将所有数据库操作移至同步子线程中。
MariaDB
支持MariaDB 10.1或者更高版本。
PostgreSQL
通过为模型添加Meta.constraints选项,可以在PostgreSQL数据库中添加exclusion约束。
过滤表达式
现在可以在QuerySet过滤操作中直接使用输出布尔值的表达式,而不用先聚合再过滤。
模型字段可选项的枚举
新增枚举类TextChoices,IntegerChoices和Choices ,它们都是Field.choices的子类。也就是说你以后不用在CharField中添加choices参数了,可以直接创建一个TextChoices对象。
小功能
下面是一些细微的变化(省略了一些不常用的)
django.contrib.admin
- 为
ModelAdmin.list_display添加admin_order_field支持 - 新
ModelAdmin.get_inlines()方法允许根据请求或模型实例指定为inline模式 - Select2库从4.0.3版本升级到4.0.7
- jQuery从3.3.1版本升级到3.4.1
django.contrib.auth
PasswordResetConfirmView可以增加新的reset_url_token属性- 新增
BaseBackend类,以简化认证后端的自定义。 - 新增
get_user_permissions()方法,以镜像现有的get_group_permissions()方法。 - 为HTML页面中的用户名、电子邮件和密码字段的小部件中添加了
autocomplete属性,以更好地与浏览器器进行交互。 - 当执行
createsuperuser命令时,如果在非交互模式下未提供相应的命令行参数,将退回到密码和必填字段的环境变量。 ManyToManyField现在可以使用REQUIRED_FIELDS。- 新的
UserManager.with_perm()方法将返回具有指定权限的用户。 PBKDF2密码哈希器的默认迭代计数从150,000增加到180,000。
django.contrib.sessions
新的get_session_cookie_age() 方法允许动态指定会话cookie的生存周期。
Models
新增哈希数据库功能MD5, SHA1, SHA224, SHA256, SHA384,和 SHA512。
添加了Sign数据库功能。
FilePathField现在接受可调用对象自引用的
ManyToManyField字段允许使用对称的中间表Avg和Sum聚合功能现在支持distinct参数,可以去重。新增
SmallAutoField字段,类似AutoField字段,区别在于前者只允许一个较小的值范围,比如从1到32767,这样会更安全一点。AutoField、BigAutoField以及SmallAutoField分别继承了IntegerField、BigIntegerField和SmallIntegerField,所以其系统检查和验证器也相应分别继承。FileField.upload_to现在支持pathlib.Path。CheckConstraint在MySQL 8.0.16+上被支持。
Django3.0 向后不兼容
(简要介绍一下)
- 不再支持9.5以下的PostgreSQL
- 不再支持12.2以下的Oracle
- 正式删除Python 2兼容性相关的API
- 某些安全设置现在具有更安全的默认值:
X_FRAME_OPTIONS现在默认为'DENY'。SECURE_CONTENT_TYPE_NOSNIFF现在默认为True。 - 不再支持1.2.0以下的
pywatchman库
Django3.0中废弃的一些功能
django.utils.encoding.force_text() and smart_text()
一些django.utils中的和http、translation、text等相关的内容。
Django 3.0中删除的功能
以下方法、属性和设置被删除了:
django.db.backends.postgresql_psycopg2模块django.shortcuts.render_to_response()方法DEFAULT_CONTENT_TYPE设置HttpRequest.xreadlines()方法Field.from_db_value()和Expression.convert_value()方法QuerySet.earliest()和latest()的field_name关键字参数django.utils.http.cookie_date()方法staticfiles和admin_static模板标签库django.contrib.staticfiles.templatetags.staticfiles.static()方法
总结
从版本说明中我们可以看出,Django3.0最核心的变化是支持基于ASGI的异步通信,其它细微的改动一般用户基本感受不出来。
异步通信的功能据说是将django-channle这个外部库纳入进来,作为Django官方核心标准功能之一。无论如何,HTML5的websocket将可以直接和Django进行通信了。基于Django实现网页聊天室、网页QQ、网页微信等实时通信应用将变得简单,我们可以和长短轮询说再见了。
(更多Django相关内容和最新变化,请关注我的官网www.liujiangblog.com,相关最新教学视频也将第一时间发布!)
Django3.0 前瞻 支持异步通信的更多相关文章
- Django3.0中向后不兼容的更改
3.0中向后不兼容的更改 数据库后端API 本节描述了第三方数据库后端中可能需要的更改. 现在的第二个参数DatabaseIntrospection.get_geometry_type()是行描述,而 ...
- Django3.0 异步通信初体验
此前博主曾经写过一篇博文,介绍了Django3.0的新特性,其中最主要的就是加入对ASGI的支持,实现全双工的异步通信. 2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我 ...
- Django3.0 异步通信初体验(小结)
2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我们来尝试一下吧! (附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/e ...
- CozyRSS开发记录18-番外之Atom1.0的支持
CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...
- STSdb,最强纯C#开源NoSQL和虚拟文件系统 4.0 RC2 支持C/S架构
STSdb是什么 再来说明一下STSdb是什么:STSdb是C#写的开源嵌入式数据库和虚拟文件系统,支持实时索引,性能是同类产品的几倍到几十倍,访问官方网站. 温故知新 之前发了文章<STSdb ...
- 亲测!Jquery2.0不支持IE8-了
最近由于测试需要,Win7回退到了官方更新的IE8浏览器,惊人的发现: <script src="//cdn.bootcss.com/jquery/2.0.0/jquery.min.j ...
- [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)
在上上一篇基于OIDC的SSO的登录页面的截图中有出现QQ登录的地方.这个其实是通过扩展OIDC的OpenID Provider来实现的,OpenID Provider简称OP,OP是OIDC的一个很 ...
- 【树莓派】【转】树莓派3装Android 6.0,支持Wi-Fi和蓝牙
树莓派3装Android 6.0,支持Wi-Fi和蓝牙 相信对于许多树莓派初学者(包括我)来说,Android系统的确是一个不错的选择.但国内这方面资源稀缺,经本人FQ苦寻,找到了老外的树莓派Andr ...
- C# 6.0可能会支持模式匹配了
今天在CodePlex的Roslyn讨论区发现了一个帖子:Draft spec for records and pattern-matching in C#,估计MS计划在C# 6.0中支持模式匹配了 ...
随机推荐
- PWA学习笔记(二)
设计与体验 APP Shell: 1.应用从显示内容上可粗略划分为内容部分和外壳部分,App Shell 就是外壳部分,即页面的基本结构 2.它不仅包括用户能看到的页面框架部分,还包括用户看不到的代码 ...
- django 做 migrate 时 表已存在的处理
在开发web的时候,如果是以前已存在的项目,项目下载下来后,为了使用测试库的数据,会直接将整个测试库(如sqlite3)拿到本机来.这种情况下,如果执行的顺序不对,很容易在执行migrate的时候出现 ...
- application context not configured for this file于spring框架使用中的原因
spring配置文件中时常会出现这个提示,翻译过来大概意思就是没有配置该文件到项目中 于是进入到Project Structure中查看 可以很明显的看到下面有个感叹号,大概意思是下面的文件没有匹配 ...
- 误区以为父组件render一次,子组件会重新初始化
初学react的时候我有一个误区,以为父组件render的一次,会将子组件先卸载,再将子组件重新初始化,事实证明不是. 这是对react生命周期函数不太清楚. 父子组件都初始化后,父组件再render ...
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3
A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6) 那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10) 思路:我们想一下如果题目说的是最 ...
- 【转】开发一个这样的 APP 要多长时间?
作者:蒋国刚 www.cnblogs.com/guogangj/p/4676836.html 呵呵. 这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着 ...
- Python文件操作:文件的打开关闭读取写入
Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...
- lxml导入
通常的导入方式 from lxml import etree python有自带的ElementTree库,但lxml在其基础上新增了特有的功能 如果代码仅使用ElementTree API,不依赖于 ...
- Dubbo学习笔记-Zookeeper连接失败
1. 检查服务器的zookeeper端口是否开放,默认为2181 2. 检查zookeeper是否运行成功 # 进入bin文件夹 cd /usr/local/zookeeper/bin # 重启 zk ...
- Web安全测试学习笔记-DVWA-SQL注入-1
SQL注入的定义网上很多,作为一个初学者,我对SQL注入的理解是这样的:网站应用一般都有后台数据库(不论是关系型还是非关系型),用户在网站上的绝大部分操作,最终都会跟数据库交互(也就是执行一串SQL语 ...