Django 4.0 正式发布,4.0 版本支持 Python 3.8、3.9 和 3.10。随着 Django 4.0 的发布,Django 3.2 的主流支持已经结束。此版本主要有如下亮点:
zoneinfo
Django 3.2 允许使用非 pytz 时区。Django 4.0 是 zoneinfo 作为默认时区:弃用 pytz 且将在 Django 5.0 中删除它。zoneinfo 是 Python 3.9 标准库的一部分,如果你在使用 Python 3.8 ,则会自动安装 zoneinfo 包。
pytz
注意,如果你处于非 utc(世界标准时间) 时区,且在使用 pytz normalize() 和 localalize () api,那你可能设置了TIME_ZONE ,需要审查一下代码。4.x 系列版本周期有一个过渡性的 use_depreccated_pytz 设置,允许从 pytz 慢慢过渡到 zoneinfo,这个设置将在 Django 5.0 中删除。
use_depreccated_pytz
此外,zoneinfo 作者创建的 pytz_deprecation_shim 包用于帮助从 pytz 进行迁移,这个包提供 shims 来安全地移除 pytz,还有一个详细的迁移指南,展示如何移动到新的 zoneinfo api。渐进更新可以用 pytz_deprecation_shim和use_depreccated_pytz 这两个过渡设置。
pytz_deprecation_shim
UniqueConstraint() 的新 *expressions 位置参数可以在表达式和数据库函数上创建函数式唯一约束。例如:
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选项将函数唯一约束添加到模型中 。
Meta.constraints
scrypt
新的 scrypt 密码哈希器比 PBKDF2 更安全,建议使用。但它不是默认选项,因为它需要 OpenSSL 1.1 以上版本和更多的内存。
新的django.core.cache.backends.redis.RedisCache 缓存后端为使用 Redis 缓存提供了内置支持。此功能需要 redis-py 3.0.0 或更高版本。
django.core.cache.backends.redis.RedisCache
使用模板引擎渲染表单,如用于表单的 render(), get_context() 和 template_name,用于表单集的五个渲染相关的属性和方法。
render()
get_context()
template_name
django.contrib.admin
admin/base.html
header
ModelAdmin.get_formset_kwargs()
AdminSite.each_context()
ModelAdmin.search_help_text
django.contrib.auth
LoginView.next_page
get_default_redirect_url()
django.contrib.gis
GDALRaster
django.contrib.postgres
AddConstraintNotValid
ValidateConstraint
ArraySubquery()
trigram_word_similar
TrigramWordDistance()
TrigramWordSimilarity()
django.contrib.staticfiles
ManifestStaticFilesStorage
ManifestFilesMixin
manifest_storage
新的异步 API: django.core.cache.backends.base.BaseCache开始使缓存后端异步兼容。新的异步方法都有 a 前缀的名称,例如aadd(),aget(),aset(), aget_or_set(),或adelete_many()。
django.core.cache.backends.base.BaseCache
a
aadd()
aget()
aset()
aget_or_set()
adelete_many()
以后 a 前缀一般会用于方法的异步变体。
Origin
CSRF_TRUSTED_ORIGINS
DeleteView 现在使用 FormMixin,允许您提供一个 Form 子类,例如带有确认删除之类的复选框。
DeleteView
FormMixin
Form
runserver
--skip-checks
dbshell
BaseCommand.suppressed_base_arguments
startapp——exclude
startproject——exclude
QuerySet.contains(obj)
Round()
precision
QuerySet.bulk_create()
DurationField
QuerySet.bulk_update()
Expression.empty_result_set_value
QuerySet.select_for_update()
skip_locked
Lookup
QuerySet
SecurityMiddleware
'same-origin'
pre_migrate()
post_migrate()
stdout
sys.stdout
print()
floatformat
u
django.test.utils.setup_databases()
serialized_aliases
DATABASES
--buffer
DiscoverRunner
logger
--shuffle
test --parallel
auto
TestCase.captureOnCommitCallbacks()
transaction.on_commit()
Django 4.0 是一个超大版本更新,除了上述更新以外还包含一些功能的弃用,以及不向后兼容的更新项,完整版更新内容可在更新公告中查看。
评论删除后,数据将无法恢复
Django 4.0 正式发布,新的密码哈希器和 Redis 缓存后端
Django 4.0 正式发布,4.0 版本支持 Python 3.8、3.9 和 3.10。随着 Django 4.0 的发布,Django 3.2 的主流支持已经结束。此版本主要有如下亮点:
重要更新
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,还有一个详细的迁移指南,展示如何移动到新的zoneinfoapi。渐进更新可以用 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,用于表单集的五个渲染相关的属性和方法。次要更新项:
django.contrib.adminadmin/base.html模板现在有一个header,包含管理站点标题的新模块。ModelAdmin.get_formset_kwargs()方法允许自定义传递给表单集构造函数的关键字参数。AdminSite.each_context()方法中。ModelAdmin.search_help_text属性允许为搜索框指定描述性文本django.contrib.authLoginView.next_page属性和get_default_redirect_url()方法允许在登录后自定义重定向。django.contrib.gisGDALRaster现在允许在任何 GDAL 虚拟文件系统中创建栅格。django.contrib.postgresAddConstraintNotValid操作允许在 PostgreSQL 上创建检查约束,而无需验证所有现有行是否满足新约束。ValidateConstraint操作允许验证AddConstraintNotValid在 PostgreSQL 上创建的检查约束 。ArraySubquery()表达式允许使用子查询在 PostgreSQL 上构建值列表。trigram_word_similar查找和TrigramWordDistance()和TrigramWordSimilarity()表达式允许使用三元组词汇相似性(trigram word similarity)。django.contrib.staticfilesManifestStaticFilesStorage现在将 JavaScript 源映射引用的路径换成它们自己的散列对应路径。ManifestFilesMixin和ManifestStaticFilesStorage的新参数manifest_storage允许自定义清单文件的存储。缓存
新的异步 API:
django.core.cache.backends.base.BaseCache开始使缓存后端异步兼容。新的异步方法都有a前缀的名称,例如aadd(),aget(),aset(),aget_or_set(),或adelete_many()。以后
a前缀一般会用于方法的异步变体。CSRF
Origin标头(如果存在)。为此需要对CSRF_TRUSTED_ORIGINS设置进行一些更改。国际化
通用视图
DeleteView现在使用FormMixin,允许您提供一个Form子类,例如带有确认删除之类的复选框。日志
管理命令
runserver管理命令现在支持--skip-checks选项。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 功能。--buffer并行测试选项。DiscoverRunner的新logger参数允许使用 Python 记录器进行日志记录。--shuffle以随机顺序执行测试的选项。test --parallel选项现在支持auto值:为每个处理器核心运行一个测试进程。TestCase.captureOnCommitCallbacks()现在捕获执行transaction.on_commit()回调时添加的新回调。Django 4.0 是一个超大版本更新,除了上述更新以外还包含一些功能的弃用,以及不向后兼容的更新项,完整版更新内容可在更新公告中查看。