Django 4.0 正式发布,4.0 版本支持 Python 3.8、3.9 和 3.10。随着 Django 4.0 的发布,Django 3.2 的主流支持已经结束。此版本主要有如下亮点:
- 新的 RedisCache 后端为使用 Redis 缓存提供了内置支持。
- 现在使用模板引擎呈现 Forms、Formsets 和 ErrorList ,以简化自定义的过程。
- 引入新的密码哈希函数 scrypt,但因为需要更多内存且依赖 OpenSSL 1.1+ ,不是默认启用项
- Python 标准库的 zoneinfo 现在作为 Django 中的默认时区。
- 新增函数式唯一约束。
- ...
重要更新
zoneinfo 作为默认时区
Django 3.2 允许使用非 pytz 时区。Django 4.0 是 zoneinfo 作为默认时区:弃用 pytz 且将在 Django 5.0 中删除它。zoneinfo 是 Python 3.9 标准库的一部分,如果你在使用 Python 3.8 ,则会自动安装 zoneinfo 包。
注意,如果你处于非 utc(世界标准时间) 时区,且在使用 pytz normalize() 和 localalize () api,那你可能设置了TIME_ZONE ,需要审查一下代码。4.x 系列版本周期有一个过渡性的 use_depreccated_pytz 设置,允许从 pytz 慢慢过渡到 zoneinfo,这个设置将在 Django 5.0 中删除。
此外,zoneinfo 作者创建的 pytz_deprecation_shim 包用于帮助从 pytz 进行迁移,这个包提供 shims 来安全地移除 pytz,还有一个详细的迁移指南,展示如何移动到新的 zoneinfo api。渐进更新可以用 pytz_deprecation_shim和use_depreccated_pytz 这两个过渡设置。
函数的唯一约束
UniqueConstraint() 的新 *expressions 位置参数可以在表达式和数据库函数上创建函数式唯一约束。例如:
from django.db import models
from django.db.models import UniqueConstraint
from django.db.models.functions import Lower
class MyModel(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
class Meta:
indexes = [
UniqueConstraint(
Lower('first_name'),
Lower('last_name').desc(),
name='first_last_name_unique',
),
]
使用该 Meta.constraints选项将函数唯一约束添加到模型中 。
增加 scrypt 密码哈希器
新的 scrypt 密码哈希器比 PBKDF2 更安全,建议使用。但它不是默认选项,因为它需要 OpenSSL 1.1 以上版本和更多的内存。
Redis 缓存后端
新的django.core.cache.backends.redis.RedisCache 缓存后端为使用 Redis 缓存提供了内置支持。此功能需要 redis-py 3.0.0 或更高版本。
基于模板的表单渲染
使用模板引擎渲染表单,如用于表单的 render(), get_context() 和 template_name,用于表单集的五个渲染相关的属性和方法。
次要更新项:
- 添加了对 SpatiaLite 5 的支持。
GDALRaster 现在允许在任何 GDAL 虚拟文件系统中创建栅格。
缓存
新的异步 API: django.core.cache.backends.base.BaseCache开始使缓存后端异步兼容。新的异步方法都有 a 前缀的名称,例如aadd(),aget(),aset(), aget_or_set(),或adelete_many()。
以后 a 前缀一般会用于方法的异步变体。
CSRF
国际化
通用视图
DeleteView 现在使用 FormMixin,允许您提供一个 Form 子类,例如带有确认删除之类的复选框。
日志
管理命令
模块
请求和响应
SecurityMiddleware 现在增加了跨来源打开器策略(Cross-Origin-Opener-Policy)标头的值:'same-origin',以防止交叉来源的弹出窗口请求共享同一浏览器的上下文,使用 COOP 隔离窗口是一种针对跨域攻击的深度防御保护,尤其是像 Spectre 这样的攻击(允许外泄加载到共享浏览上下文中的数据)。
信号
模板
Django 4.0 是一个超大版本更新,除了上述更新以外还包含一些功能的弃用,以及不向后兼容的更新项,完整版更新内容可在更新公告中查看。