Django 3.0 發布了,此版本帶來了一些新特性,其中最值得關注的應當是其開始支持異步功能。
此前我們報導過,有草案提出要讓 Django 支持異步。聚集于 HTTP 中間件視圖和 ORM,開發者要在 Django 中添加異步支持,同時維護對同步 Python 的支持,并且將完全向后兼容。
該設想最終會替換掉Django 中的大多數阻塞部分,包括 Session、Auth、ORM 與 Handlers 等,使其原生支持異步。而同步 API 將繼續存在并得到完全支持,其中一些最終將轉變為原生異步代碼的同步包裝器。
ASGI 模式將 Django 作為原生異步應用程序運行,原有的 WSGI 模式將圍繞每個 Django 調用運行單個事件循環,以使異步處理層與同步服務器兼容。
在這個改造的過程中,每個特性都會經歷以下三個實現階段:
Sync-only,只支持同步,也就是當前的情況
Sync-native,原生同步,同時帶有異步封裝器
Async-native,原生異步,同時帶同步封裝器
Django 3.0 開始提供運行 ASGI 應用支持,讓 Django 逐漸具備異步功能。做了這一改動后,Django 現在會感知到異步事件循環,并將阻止從異步上下文調用標記為“異步不安全”的代碼(例如 ORM 操作),如果開發者之前使用的是異步代碼,則可能會觸發。如果看到 SynchronousOnlyOperation 錯誤,可以仔細檢查代碼并將數據庫操作移到同步子線程中。
其它方面,Django 現在支持 MariaDB 10.1 及更高版本;新的 ExclusionConstraint 類可以在 PostgreSQL 上添加排除約束;輸出 BooleanField 的表達式現在可以直接在 QuerySet 過濾器中使用,而無需先注解然后對注解進行過濾;自定義枚舉類型 TextChoices、IntegerChoices 和 Choices 現在可用作定義 Field.choices 的方法。
此外還有一些小改動,詳情查看更新說明:
https://docs.djangoproject.com/en/3.0/releases/3.0
需要注意的是,Django 3.0 支持 Python 3.6、3.7 與 3.8,Django 2.2.x 系列是最后一個支持 Python 3.5 的系列。官方同時也建議第三方應用作者放棄對 Django 2.2 之前的所有版本的支持。