跳转到主要内容
Chinese, Simplified

Django 4.0 于 2021 年 12 月 7 日发布

Python 兼容性
Django 4.0 支持 Python 3.8、3.9 和 3.10。强烈推荐,并且仅官方支持每个系列的最新版本。
注意力:
Django 3.2.x 系列是最后一个支持 Python 3.6 和 3.7
关于 Django 4.0 你需要知道的那些事


1-您可以使用 Scrypt 密码哈希


新的 scrypt 密码散列器比 PBKDF2 更安全,推荐使用。但是,它不是默认设置,因为它需要 OpenSSL 1.1+ 和更多内存。
scrypt 与 PBKDF2 和 bcrypt 类似,它利用一定数量的迭代来减缓暴力攻击。但是,由于 PBKDF2 和 bcrypt 不需要大量内存,因此资源充足的攻击者可以发起大规模并行攻击,以加快攻击进程。与其他基于密码的密钥派生函数相比,scrypt 专门设计为使用更多内存,以限制攻击者可以使用的并行量。
要使用 scrypt 作为您的默认存储算法,
修改 PASSWORD_HASHERS 以首先列出 ScryptPasswordHasher。也就是说,在您的设置文件中:

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.ScryptPasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]


2-请求和响应


SecurityMiddleware 现在添加了值为 'same-origin' 的 Cross-Origin Opener Policy 标头,以防止跨域弹出窗口共享相同的浏览上下文。您可以通过将 SECURE_CROSS_ORIGIN_OPENER_POLICY 设置设置为 None 来防止添加此标头。

3- SecurityMiddleware 不再设置 X-XSS-Production 标头


如果 SECURE_BROWSER_XSS_FILTER 设置为 True,SecurityMiddleware 不再设置 X-XSS-Protection 标头。该设置被删除。
大多数现代浏览器不支持 X-XSS-Protection HTTP 标头。您可以使用 Content-Security-Policy 而不允许使用“不安全内联”脚本。
如果您想支持旧版浏览器并设置标头,请在自定义中间件中使用此行:

response.headers.setdefault('X-XSS-Protection', '1; mode=block')

​​​​​​​4- CSRF-TOKEN


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


5- 通用视图


DeleteView 现在使用 FormMixin 来处理 POST 请求。因此,delete() 处理程序中的任何自定义删除逻辑都应移至 form_valid() 或共享辅助方法(如果需要)。


6- 表格


ModelChoiceField 现在包括在引发的 ValidationError 的 params 参数中为 invalid_choice 错误消息提供的值。这允许自定义错误消息使用 %(value)s 占位符。
BaseFormSet 现在使用额外的非形式类呈现非形式错误,以帮助将它们与特定于表单的错误区分开来。
BaseFormSet 现在允许自定义通过 can_delete 删除表单时使用的小部件,方法是设置 delete_widget 属性或覆盖 get_deletion_widget() 方法。

7-模型


新的 QuerySet.contains(obj) 方法返回查询集是否包含给定对象。这试图以最简单和最快的方式执行查询。
Round() 数据库函数的新精度参数允许指定舍入后的小数位数。
QuerySet.bulk_create() 现在在使用 SQLite 3.35+ 时设置对象的主键。
DurationField 现在支持 SQLite 上的标量值乘除。
QuerySet.bulk_update() 现在返回更新的对象数。
新的 Expression.empty_result_set_value 属性允许指定在函数用于空结果集时要返回的值。
MariaDB 10.6+ 现在允许使用 QuerySet.select_for_update() 的 skip_locked 参数。
查找表达式现在可以在 QuerySet 注释、聚合中使用,也可以直接在过滤器中使用。
内置聚合的新默认参数允许指定在查询集(或分组)不包含条目时返回的值,而不是 None。

8- 功能独特的约束


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:
        constraints = [
            UniqueConstraint(
                Lower('first_name'),
                Lower('last_name').desc(),
                name='first_last_name_unique',
            ),
        ]


使用 Meta.constraints 选项将功能唯一约束添加到模型中。


9- 模板


基于模板的表单渲染
现在使用模板引擎呈现 Forms、Formsets 和 ErrorList 以增强自定义。请参见 Formset 的新 render()、get_context() 和 template_name 和 Formset 渲染。
floatformat 模板过滤器现在允许使用 u 后缀来强制禁用本地化。


10-管理命令


runserver 管理命令现在支持 --skip-checks 选项。
在 PostgreSQL 上,dbshel​​l 现在支持指定密码文件。
shell 命令现在在启动时尊重 sys.__interactivehook__。这允许在交互式会话之间加载 shell 历史记录。因此,如果在隔离模式下运行,则不再加载 readline。
新的 BaseCommand.suppressed_base_arguments 属性允许在帮助输出中抑制不支持的默认命令选项。
新的 startapp --exclude 和 startproject --exclude 选项允许从模板中排除目录。

原文:https://aliarefwriorr.medium.com/top-10-things-you-need-to-know-about-d…

本文:https://jiagoushi.pro/top-10-things-you-need-know-about-django-40

Tags
 
Article
知识星球
 
微信公众号
 
视频号