最近两年,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过滤操作中直接使用输出布尔值的表达式,而不用先聚合再过滤。

模型字段可选项的枚举

新增枚举类TextChoicesIntegerChoicesChoices ,它们都是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字段允许使用对称的中间表

  • AvgSum聚合功能现在支持distinct参数,可以去重。

  • 新增SmallAutoField字段,类似AutoField字段,区别在于前者只允许一个较小的值范围,比如从1到32767,这样会更安全一点。

  • AutoFieldBigAutoField以及 SmallAutoField分别继承了IntegerFieldBigIntegerFieldSmallIntegerField,所以其系统检查和验证器也相应分别继承。

  • 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() 方法
  • staticfilesadmin_static模板标签库
  • django.contrib.staticfiles.templatetags.staticfiles.static() 方法

总结

从版本说明中我们可以看出,Django3.0最核心的变化是支持基于ASGI的异步通信,其它细微的改动一般用户基本感受不出来。

异步通信的功能据说是将django-channle这个外部库纳入进来,作为Django官方核心标准功能之一。无论如何,HTML5的websocket将可以直接和Django进行通信了。基于Django实现网页聊天室、网页QQ、网页微信等实时通信应用将变得简单,我们可以和长短轮询说再见了。

(更多Django相关内容和最新变化,请关注我的官网www.liujiangblog.com,相关最新教学视频也将第一时间发布!)

Django3.0 前瞻 支持异步通信的更多相关文章

  1. Django3.0中向后不兼容的更改

    3.0中向后不兼容的更改 数据库后端API 本节描述了第三方数据库后端中可能需要的更改. 现在的第二个参数DatabaseIntrospection.get_geometry_type()是行描述,而 ...

  2. Django3.0 异步通信初体验

    此前博主曾经写过一篇博文,介绍了Django3.0的新特性,其中最主要的就是加入对ASGI的支持,实现全双工的异步通信. 2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我 ...

  3. Django3.0 异步通信初体验(小结)

    2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我们来尝试一下吧! (附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/e ...

  4. CozyRSS开发记录18-番外之Atom1.0的支持

    CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...

  5. STSdb,最强纯C#开源NoSQL和虚拟文件系统 4.0 RC2 支持C/S架构

    STSdb是什么 再来说明一下STSdb是什么:STSdb是C#写的开源嵌入式数据库和虚拟文件系统,支持实时索引,性能是同类产品的几倍到几十倍,访问官方网站. 温故知新 之前发了文章<STSdb ...

  6. 亲测!Jquery2.0不支持IE8-了

    最近由于测试需要,Win7回退到了官方更新的IE8浏览器,惊人的发现: <script src="//cdn.bootcss.com/jquery/2.0.0/jquery.min.j ...

  7. [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)

    在上上一篇基于OIDC的SSO的登录页面的截图中有出现QQ登录的地方.这个其实是通过扩展OIDC的OpenID Provider来实现的,OpenID Provider简称OP,OP是OIDC的一个很 ...

  8. 【树莓派】【转】树莓派3装Android 6.0,支持Wi-Fi和蓝牙

    树莓派3装Android 6.0,支持Wi-Fi和蓝牙 相信对于许多树莓派初学者(包括我)来说,Android系统的确是一个不错的选择.但国内这方面资源稀缺,经本人FQ苦寻,找到了老外的树莓派Andr ...

  9. C# 6.0可能会支持模式匹配了

    今天在CodePlex的Roslyn讨论区发现了一个帖子:Draft spec for records and pattern-matching in C#,估计MS计划在C# 6.0中支持模式匹配了 ...

随机推荐

  1. Ligg.WinOa-000: Windows运维自动化编程实战--前言

        本开源项目Ligg.WinOa是一个基于Ligg.EasyWinApp的Windows运维自动化应用.通过Ligg.EasyWinForm生成2个功能界面:管理员工具箱和用户工具箱:通过Lig ...

  2. Troubleshooting: High Version Count Issues

    --查询版本高的原因 select * from v$sql_shared_cursor where sql_id=''; Configuring Download the script in the ...

  3. 线上cpu使用率过高解决方案

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top命令得到 ...

  4. "echo 0 /proc/sys/kernel/hung_task_timeout_secs" disable this message

    问题现象: 问题原因: 默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的IO请求都是同步的. 将缓存写入磁盘时 ...

  5. Think in Java 笔记(chapter1-7)

    Content Chapter 1:对象导论 Chapter 2:一切都是对象 Chapter 3:操作符 Chapter 4:控制执行流程 Chapter 5:初始化与清理 Chapter 6:访问 ...

  6. Network出现两次相同请求?

    出现的状况 Network中出现了两个相同的请求(如图),两个发起了同样的请求,花的时间却不同,一个55ms,一个花了294ms.   两个相同的请求 什么情况啊?研究了一番,我发现有一个地方是不同的 ...

  7. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  8. jQuery 源码解析(二十七) 样式操作模块 坐标详解

    样式操作模块可用于管理DOM元素的样式.坐标和尺寸,本节讲解一下坐标这一块. 对于坐标来说,jQuery提供了一个offset方法用于获取第一个匹配元素的坐标或者设置所有匹配元素的坐标,还有offse ...

  9. C# HttpClient设置cookies的两种办法

    前言:最近公司使用HttpClient对象在发送请求,抛弃了之前的HttpWebRequest,使用httpClient有个好处:就是可以只使用一个HttpClient的实例,去完成发送所有的请求数据 ...

  10. 前端知识体系-NodeJS相关】NodeJS基础知识全面总结

    NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...