Django 4.0 正式发布,新的密码哈希器和 Redis 缓存后端

时间:2022-01-25 10:45:48

Django 4.0 正式发布,新的密码哈希器和 Redis 缓存后端

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 位置参数可以在表达式和数据库函数上创建函数式唯一约束。例如:

  1. from django.db import models
  2. from django.db.models import UniqueConstraint
  3. from django.db.models.functions import Lower
  4. class MyModel(models.Model):
  5. first_name = models.CharField(max_length=255)
  6. last_name = models.CharField(max_length=255)
  7. class Meta:
  8. indexes = [
  9. UniqueConstraint(
  10. Lower('first_name'),
  11. Lower('last_name').desc(),
  12. name='first_last_name_unique',
  13. ),
  14. ]

使用该 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,用于表单集的五个渲染相关的属性和方法。

次要更新项:

django.contrib.admin

  • admin/base.html 模板现在有一个 header ,包含管理站点标题的新模块。
  • ModelAdmin.get_formset_kwargs() 方法允许自定义传递给表单集构造函数的关键字参数。
  • 侧边栏的导航有一个快速过滤器工具栏。
  • 新的上下文变量模型(包含每个模型的模型类)被添加到 AdminSite.each_context() 方法中。
  • 新 ModelAdmin.search_help_text 属性允许为搜索框指定描述性文本
  • jQuery 从 3.5.1 版本升级到 3.6.0。

django.contrib.auth

  • PBKDF2 密码散列器的默认迭代计数从 260,000 增加到 320,000。
  • 新的 LoginView.next_page 属性和 get_default_redirect_url()方法允许在登录后自定义重定向。

django.contrib.gis

  • 添加了对 SpatiaLite 5 的支持。
  • GDALRaster 现在允许在任何 GDAL 虚拟文件系统中创建栅格。

django.contrib.postgres

  • PostgreSQL 后端现在支持通过服务名称进行连接。详情请参见 PostgreSQL 连接配置。
  • 新 AddConstraintNotValid 操作允许在 PostgreSQL 上创建检查约束,而无需验证所有现有行是否满足新约束。
  • 新 ValidateConstraint 操作允许验证 AddConstraintNotValid 在 PostgreSQL 上创建的检查约束 。
  • 新 ArraySubquery() 表达式允许使用子查询在 PostgreSQL 上构建值列表。
  • 新的trigram_word_similar 查找和 TrigramWordDistance() 和 TrigramWordSimilarity() 表达式允许使用三元组词汇相似性(trigram word similarity)。

django.contrib.staticfiles

  • ManifestStaticFilesStorage 现在将 JavaScript 源映射引用的路径换成它们自己的散列对应路径。
  • ManifestFilesMixin 和 ManifestStaticFilesStorage 的新参数 manifest_storage 允许自定义清单文件的存储。

缓存

新的异步 API:

  1. django.core.cache.backends.base.BaseCache开始使缓存后端异步兼容。新的异步方法都有 a 前缀的名称,例如aadd(),aget(),aset(), aget_or_set(),或adelete_many()。

以后 a 前缀一般会用于方法的异步变体。

CSRF

  • CSRF 保护现在参考 Origin 标头(如果存在)。为此需要对 CSRF_TRUSTED_ORIGINS 设置进行一些更改。

国际化

  • 添加了对马来语的支持和翻译。

通用视图

  • DeleteView 现在使用 FormMixin,允许您提供一个 Form 子类,例如带有确认删除之类的复选框。

日志

  • SQL 调用中使用的数据库别名现在作为额外的上下文,与每条消息一起传递给 django.db.backends 记录器。

管理命令

  • runserver 管理命令现在支持 --skip-checks选项。
  • 在 PostgreSQL 上,dbshell 现在支持指定密码文件。
  • 新的 BaseCommand.suppressed_base_arguments属性允许在输出中阻止不支持的命令选项。
  • 新的 startapp——exclude 和 startproject——exclude 选项允许从模板中排除目录

模块

  • 新 QuerySet.contains(obj)方法返回查询集是否包含给定的对象,会尝试以最简单和最快的方式执行查询。
  • 数据库函数 Round() 有新的 precision 参数,允许指定舍入的小数位数。
  • QuerySet.bulk_create() 现在在使用 SQLite 3.35+ 时设置对象的主键。
  • DurationField 现在支持在 SQLite 上乘以和除以标量值。
  • QuerySet.bulk_update() 现在返回更新后的对象数。
  • 新的 Expression.empty_result_set_value 属性允许指定函数在空集上使用时返回什么值。
  • QuerySet.select_for_update()的 skip_locked 参数,现在允许在 MariaDB 10.6 以上版本使用。
  • Lookup现在可以在QuerySet 注释、聚合中使用表达式,且可以直接在过滤器中使用。

请求和响应

  • SecurityMiddleware 现在增加了跨来源打开器策略(Cross-Origin-Opener-Policy)标头的值:'same-origin',以防止交叉来源的弹出窗口请求共享同一浏览器的上下文,使用 COOP 隔离窗口是一种针对跨域攻击的深度防御保护,尤其是像 Spectre 这样的攻击(允许外泄加载到共享浏览上下文中的数据)。

信号

  • 用于 pre_migrate() 和 post_migrate() 信号的新 stdout 参数,允许将输出重定向到一个类似流的对象。
  • 为了在测试时正确捕获,它应该优先于 并且在发出详细输出时。pre_migrate()post_migrate()sys.stdoutprint()

模板

floatformat 模板过滤器现在允许使用 u 后缀强制禁用本地化。

测试

  • django.test.utils.setup_databases() 的新参数 serialized_aliases 可以决定哪些 DATABASES别名测试数据库应该将自身状态序列化,以允许使用 serialized_rollback 功能。
  • Django 测试运行器现在支持 --buffer 并行测试选项。
  • DiscoverRunner 的新 logger 参数允许使用 Python 记录器进行日志记录。
  • Django 测试运行器现在支持--shuffle 以随机顺序执行测试的选项。
  • test --parallel 选项现在支持 auto 值:为每个处理器核心运行一个测试进程。
  • TestCase.captureOnCommitCallbacks()现在捕获执行 transaction.on_commit() 回调时添加的新回调。

Django 4.0 是一个超大版本更新,除了上述更新以外还包含一些功能的弃用,以及不向后兼容的更新项,完整版更新内容可在更新公告中查看。