Django 4.0 正式發(fā)布,新的密碼哈希器和 Redis 緩存后端
Django 4.0 正式發(fā)布,4.0 版本支持 Python 3.8、3.9 和 3.10。隨著 Django 4.0 的發(fā)布,Django 3.2 的主流支持已經(jīng)結(jié)束。此版本主要有如下亮點:
- 新的 RedisCache 后端為使用 Redis 緩存提供了內(nèi)置支持。
- 現(xiàn)在使用模板引擎呈現(xiàn) Forms、Formsets 和 ErrorList ,以簡化自定義的過程。
- 引入新的密碼哈希函數(shù) scrypt,但因為需要更多內(nèi)存且依賴 OpenSSL 1.1+ ,不是默認(rèn)啟用項
- Python 標(biāo)準(zhǔn)庫的 zoneinfo 現(xiàn)在作為 Django 中的默認(rèn)時區(qū)。
- 新增函數(shù)式唯一約束。
- ...
重要更新
zoneinfo 作為默認(rèn)時區(qū)
Django 3.2 允許使用非 pytz 時區(qū)。Django 4.0 是 zoneinfo 作為默認(rèn)時區(qū):棄用 pytz 且將在 Django 5.0 中刪除它。zoneinfo 是 Python 3.9 標(biāo)準(zhǔn)庫的一部分,如果你在使用 Python 3.8 ,則會自動安裝 zoneinfo 包。
注意,如果你處于非 utc(世界標(biāo)準(zhǔn)時間) 時區(qū),且在使用 pytz normalize() 和 localalize () api,那你可能設(shè)置了TIME_ZONE ,需要審查一下代碼。4.x 系列版本周期有一個過渡性的 use_depreccated_pytz 設(shè)置,允許從 pytz 慢慢過渡到 zoneinfo,這個設(shè)置將在 Django 5.0 中刪除。
此外,zoneinfo 作者創(chuàng)建的 pytz_deprecation_shim 包用于幫助從 pytz 進(jìn)行遷移,這個包提供 shims 來安全地移除 pytz,還有一個詳細(xì)的遷移指南,展示如何移動到新的 zoneinfo api。漸進(jìn)更新可以用 pytz_deprecation_shim和use_depreccated_pytz 這兩個過渡設(shè)置。
函數(shù)的唯一約束
UniqueConstraint() 的新 *expressions 位置參數(shù)可以在表達(dá)式和數(shù)據(jù)庫函數(shù)上創(chuàng)建函數(shù)式唯一約束。例如:
- 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選項將函數(shù)唯一約束添加到模型中 。
增加 scrypt 密碼哈希器
新的 scrypt 密碼哈希器比 PBKDF2 更安全,建議使用。但它不是默認(rèn)選項,因為它需要 OpenSSL 1.1 以上版本和更多的內(nèi)存。
Redis 緩存后端
新的
django.core.cache.backends.redis.RedisCache 緩存后端為使用 Redis 緩存提供了內(nèi)置支持。此功能需要 redis-py 3.0.0 或更高版本。
基于模板的表單渲染
使用模板引擎渲染表單,如用于表單的 render(), get_context() 和 template_name,用于表單集的五個渲染相關(guān)的屬性和方法。
次要更新項:
django.contrib.admin
- admin/base.html 模板現(xiàn)在有一個 header ,包含管理站點標(biāo)題的新模塊。
- ModelAdmin.get_formset_kwargs() 方法允許自定義傳遞給表單集構(gòu)造函數(shù)的關(guān)鍵字參數(shù)。
- 側(cè)邊欄的導(dǎo)航有一個快速過濾器工具欄。
- 新的上下文變量模型(包含每個模型的模型類)被添加到 AdminSite.each_context() 方法中。
- 新 ModelAdmin.search_help_text 屬性允許為搜索框指定描述性文本
- jQuery 從 3.5.1 版本升級到 3.6.0。
django.contrib.auth
- PBKDF2 密碼散列器的默認(rèn)迭代計數(shù)從 260,000 增加到 320,000。
- 新的 LoginView.next_page 屬性和 get_default_redirect_url()方法允許在登錄后自定義重定向。
django.contrib.gis
- 添加了對 SpatiaLite 5 的支持。
- GDALRaster 現(xiàn)在允許在任何 GDAL 虛擬文件系統(tǒng)中創(chuàng)建柵格。
django.contrib.postgres
- PostgreSQL 后端現(xiàn)在支持通過服務(wù)名稱進(jìn)行連接。詳情請參見 PostgreSQL 連接配置。
- 新 AddConstraintNotValid 操作允許在 PostgreSQL 上創(chuàng)建檢查約束,而無需驗證所有現(xiàn)有行是否滿足新約束。
- 新 ValidateConstraint 操作允許驗證 AddConstraintNotValid 在 PostgreSQL 上創(chuàng)建的檢查約束 。
- 新 ArraySubquery() 表達(dá)式允許使用子查詢在 PostgreSQL 上構(gòu)建值列表。
- 新的trigram_word_similar 查找和 TrigramWordDistance() 和 TrigramWordSimilarity() 表達(dá)式允許使用三元組詞匯相似性(trigram word similarity)。
django.contrib.staticfiles
- ManifestStaticFilesStorage 現(xiàn)在將 JavaScript 源映射引用的路徑換成它們自己的散列對應(yīng)路徑。
- ManifestFilesMixin 和 ManifestStaticFilesStorage 的新參數(shù) manifest_storage 允許自定義清單文件的存儲。
緩存
新的異步 API:
- django.core.cache.backends.base.BaseCache開始使緩存后端異步兼容。新的異步方法都有 a 前綴的名稱,例如aadd(),aget(),aset(), aget_or_set(),或adelete_many()。
以后 a 前綴一般會用于方法的異步變體。
CSRF
- CSRF 保護(hù)現(xiàn)在參考 Origin 標(biāo)頭(如果存在)。為此需要對 CSRF_TRUSTED_ORIGINS 設(shè)置進(jìn)行一些更改。
國際化
- 添加了對馬來語的支持和翻譯。
通用視圖
- DeleteView 現(xiàn)在使用 FormMixin,允許您提供一個 Form 子類,例如帶有確認(rèn)刪除之類的復(fù)選框。
日志
- SQL 調(diào)用中使用的數(shù)據(jù)庫別名現(xiàn)在作為額外的上下文,與每條消息一起傳遞給 django.db.backends 記錄器。
管理命令
- runserver 管理命令現(xiàn)在支持 --skip-checks選項。
- 在 PostgreSQL 上,dbshell 現(xiàn)在支持指定密碼文件。
- 新的 BaseCommand.suppressed_base_arguments屬性允許在輸出中阻止不支持的命令選項。
- 新的 startapp——exclude 和 startproject——exclude 選項允許從模板中排除目錄
模塊
- 新 QuerySet.contains(obj)方法返回查詢集是否包含給定的對象,會嘗試以最簡單和最快的方式執(zhí)行查詢。
- 數(shù)據(jù)庫函數(shù) Round() 有新的 precision 參數(shù),允許指定舍入的小數(shù)位數(shù)。
- QuerySet.bulk_create() 現(xiàn)在在使用 SQLite 3.35+ 時設(shè)置對象的主鍵。
- DurationField 現(xiàn)在支持在 SQLite 上乘以和除以標(biāo)量值。
- QuerySet.bulk_update() 現(xiàn)在返回更新后的對象數(shù)。
- 新的 Expression.empty_result_set_value 屬性允許指定函數(shù)在空集上使用時返回什么值。
- QuerySet.select_for_update()的 skip_locked 參數(shù),現(xiàn)在允許在 MariaDB 10.6 以上版本使用。
- Lookup現(xiàn)在可以在QuerySet 注釋、聚合中使用表達(dá)式,且可以直接在過濾器中使用。
請求和響應(yīng)
- SecurityMiddleware 現(xiàn)在增加了跨來源打開器策略(Cross-Origin-Opener-Policy)標(biāo)頭的值:'same-origin',以防止交叉來源的彈出窗口請求共享同一瀏覽器的上下文,使用 COOP 隔離窗口是一種針對跨域攻擊的深度防御保護(hù),尤其是像 Spectre 這樣的攻擊(允許外泄加載到共享瀏覽上下文中的數(shù)據(jù))。
信號
- 用于 pre_migrate() 和 post_migrate() 信號的新 stdout 參數(shù),允許將輸出重定向到一個類似流的對象。
- 為了在測試時正確捕獲,它應(yīng)該優(yōu)先于 并且在發(fā)出詳細(xì)輸出時。pre_migrate()post_migrate()sys.stdoutprint()
模板
floatformat 模板過濾器現(xiàn)在允許使用 u 后綴強(qiáng)制禁用本地化。
測試
- django.test.utils.setup_databases() 的新參數(shù) serialized_aliases 可以決定哪些 DATABASES別名測試數(shù)據(jù)庫應(yīng)該將自身狀態(tài)序列化,以允許使用 serialized_rollback 功能。
- Django 測試運(yùn)行器現(xiàn)在支持 --buffer 并行測試選項。
- DiscoverRunner 的新 logger 參數(shù)允許使用 Python 記錄器進(jìn)行日志記錄。
- Django 測試運(yùn)行器現(xiàn)在支持--shuffle 以隨機(jī)順序執(zhí)行測試的選項。
- test --parallel 選項現(xiàn)在支持 auto 值:為每個處理器核心運(yùn)行一個測試進(jìn)程。
- TestCase.captureOnCommitCallbacks()現(xiàn)在捕獲執(zhí)行 transaction.on_commit() 回調(diào)時添加的新回調(diào)。
Django 4.0 是一個超大版本更新,除了上述更新以外還包含一些功能的棄用,以及不向后兼容的更新項,完整版更新內(nèi)容可在更新公告中查看。