1. 程式人生 > 其它 >Django4.0搶先看,結果令人失望

Django4.0搶先看,結果令人失望

Django 4.0版本說明

2021年12月7日,Django正式釋出了4.0版本!

這貨的版本提升速度也太快了,完全名不副實!再看看新功能,這都更新了啥?

Python 依賴

Django 4.0依賴Python 3.8+。也就是說低於這個版本的Python不行。

新功能

zoneinfo 成為預設的時區庫

Python的標準庫zoneinfo替代了過去的pytz庫,成為Django的預設時區庫。

Django3.2是個過渡版本,可以使用非pytz的時區庫。

Django4.0中,zoneinfo成為預設時區庫。

Django5.0中,pytz會被移除。

zoneinfo從Python3.9開始成為內建標準庫。如果你用的是Python3.8,安裝Django的時候,自動安裝的是 backports.zoneinfo

庫。所以,一條基本原則是:最新的Django配最新的Python。

pytz改為使用zoneinfo,基本是透明無感的。比如當前時區的選擇、在表單和模板中時區的轉換等等操作都不受影響。

但是,如果您使用了非 UTC 時區,並使用pytz normalize()localize()API,或者對TIME_ZONE進行了設定,那麼你需要稽核您的程式碼,因為pytzzoneinfo並不完全相同。

為了給程式碼審計留出時間,Django提供了一個過渡性的USE_DEPRECATED_PYTZ 設定,將它設定為True,表示允許pytz在 Django4.x 版本釋出週期期間繼續使用。此設定將在 Django 5.0 中刪除。

此外,zoneinfo 庫的作者特意提供了一個pytz_deprecation_shim包,使用者幫助你從pytz遷移到zoneinfo。有需要的可以詳細瞭解一下這個包。

點評:換個時區庫就能從3升級到4?

函式類唯一性約束

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選項將功能唯一性約束新增到模型中 。

點評:你有多大概率用上這個新特性?或者,你明白它的用法了嗎?

scrypt 密碼雜湊演算法

新的scrypt 密碼雜湊演算法比 PBKDF2 演算法更安全,推薦使用。但是,它不是預設設定,因為它需要 OpenSSL 1.1+ 依賴和更多記憶體。

點評:這麼細節嗎?

Redis快取後端

新增內建的django.core.cache.backends.redis.RedisCache快取後端,為直接使用 Redis 快取提供了內建支援。但是需要 redis-py 3.0.0 或更高版本。

點評:這個還算有點意思

基於模板引擎的表單渲染

FormsFormsetsErrorList現在使用模板引擎進行渲染以增強自定義的能力。詳見新的render()get_context()方法以及 template_name屬性。

點評:表單用得本來就不多

一些小特性

  • admin後臺的導航側邊欄新增了快速過濾工具欄
  • auth模組的PBKDF2密碼雜湊的迭代次數提高到320000
  • 新增非同步的快取後端django.core.cache.backends.base.BaseCache 。相應的非同步方法以a開頭,比如aadd(), aget(), aset(), aget_or_set()adelete_many()
  • 通用檢視DeleteView 現在繼承了 FormMixin類,允許你提供一個Form子類,用於提供一些自定製,比如用於確認刪除的複選框。同時還允許它使用 django.contrib.messages.views.SuccessMessageMixin
  • runserver管理命令新增 --skip-checks選項,可以跳過一些檢查過程。

  • 新增 startapp --excludestartproject --exclude 選項,允許指定排除模板中的目錄。

  • 新增QuerySet.contains(obj)方法,用於判定查詢集中是否包含給定的物件。它會嘗試以最簡單和最快的方式執行查詢。

  • 其它更多小細節未一一列出

更多向後不相容和廢棄功能的細節參考官方文件,實在無法逐一列出。

更多技術文章請訪問: https://www.liujiangblog.com

更多視訊教程請訪問: https://www.liujiangblog.com/video