最近兩年,Django的版本號提升得特別快,2.0還沒有多久,很快就要到3.0了。
讓我們先看看官方的路線圖和時間表:
版本號 | 發布日期 | 停止更新日期 | 停止維護日期 |
---|---|---|---|
3.0 | 2019-12 | 2020-08 | 2021-04 |
3.1 | 2020-08 | 2021-04 | 2021-12 |
3.2 LTS | 2021-04 | 2021-12 | 2024-04 |
可以看到2019年12月即將發布3.0,2022年升級為4.0,但我們感覺2.2還在昨天。
這給廣大的使用者和學習者帶來了一定的學習壓力和升級成本,但同時也代表Django的生態圈非常健康,使用者穩步上升,功能迭代迅速,是一種好的現象,我們要積極擁抱變化,拒絕落后。
接下來,讓我們看看3.0究竟有哪些新東西和新變化。
Python兼容性
不再支持3.6以下版本,僅支持3.6、3.7、3.8或者更高版本。
(按照Django的一貫策略,最新的Django請使用最新的python。)
ASGI
這是Django3.0最大的變化和提升!
通過支持ASGI,Django3.0開始具備全雙工的異步通信能力,解決其最大的短板,不再被人詬病!(Tornado的支持者拿這個說事已經不是一天兩天了)
支持ASGI並不是取代現有的WSGI,而是一種補充,也就是說我們現在有兩種服務器運行模式了。
要注意的是,只有在啟動了基於ASGI的服務器之后,才支持異步通信功能。在ASGI模式下,同時支持異步和同步通信。(WSGI模式下只能同步通信)
Django官方提供了一份部署ASGI的文檔https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/,值得學習一下。
ASGI的引入也帶來了一些需要注意的事項:Django現在會監視異步事件循環,並阻止你從異步上下文中調用被標記為異步不安全
的代碼,比如ORM操作(注意,這不是說ORM不能用了)。如果你遇到SynchronousOnlyOperation
錯誤,請仔細檢查代碼並將所有數據庫操作移至同步子線程中。
MariaDB
支持MariaDB 10.1或者更高版本。
PostgreSQL
通過為模型添加Meta.constraints
選項,可以在PostgreSQL數據庫中添加exclusion約束。
過濾表達式
現在可以在QuerySet過濾操作中直接使用輸出布爾值的表達式,而不用先聚合再過濾。
模型字段可選項的枚舉
新增枚舉類TextChoices
,IntegerChoices
和Choices
,它們都是Field.choices
的子類。也就是說你以后不用在CharField
中添加choices
參數了,可以直接創建一個TextChoices
對象。
小功能
下面是一些細微的變化(省略了一些不常用的)
django.contrib.admin
- 為
ModelAdmin.list_display
添加admin_order_field
支持 - 新
ModelAdmin.get_inlines()
方法允許根據請求或模型實例指定為inline
模式 - Select2庫從4.0.3版本升級到4.0.7
- jQuery從3.3.1版本升級到3.4.1
django.contrib.auth
-
PasswordResetConfirmView
可以增加新的reset_url_token
屬性 -
新增
BaseBackend
類,以簡化認證后端的自定義。 -
新增
get_user_permissions()
方法,以鏡像現有的get_group_permissions()
方法。 -
為HTML頁面中的用戶名、電子郵件和密碼字段的小部件中添加了
autocomplete
屬性,以更好地與瀏覽器器進行交互。 -
當執行
createsuperuser
命令時,如果在非交互模式下未提供相應的命令行參數,將退回到密碼和必填字段的環境變量。 -
ManyToManyField
現在可以使用REQUIRED_FIELDS
。 -
新的
UserManager.with_perm()
方法將返回具有指定權限的用戶。 -
PBKDF2密碼哈希器的默認迭代計數從150,000增加到180,000。
django.contrib.sessions
新的get_session_cookie_age()
方法允許動態指定會話cookie的生存周期。
Models
-
新增哈希數據庫功能MD5, SHA1, SHA224, SHA256, SHA384,和 SHA512。
-
添加了Sign數據庫功能。
-
FilePathField
現在接受可調用對象 -
自引用的
ManyToManyField
字段允許使用對稱的中間表 -
Avg
和Sum
聚合功能現在支持distinct
參數,可以去重。 -
新增
SmallAutoField
字段,類似AutoField
字段,區別在於前者只允許一個較小的值范圍,比如從1到32767,這樣會更安全一點。 -
AutoField
、BigAutoField
以及SmallAutoField
分別繼承了IntegerField
、BigIntegerField
和SmallIntegerField
,所以其系統檢查和驗證器也相應分別繼承。 -
FileField.upload_to
現在支持pathlib.Path
。 -
CheckConstraint
在MySQL 8.0.16+上被支持。
Django3.0 向后不兼容
(簡要介紹一下)
- 不再支持9.5以下的PostgreSQL
- 不再支持12.2以下的Oracle
- 正式刪除Python 2兼容性相關的API
- 某些安全設置現在具有更安全的默認值:
X_FRAME_OPTIONS
現在默認為'DENY'
。SECURE_CONTENT_TYPE_NOSNIFF
現在默認為True
。 - 不再支持1.2.0以下的
pywatchman
庫
Django3.0中廢棄的一些功能
django.utils.encoding.force_text() and smart_text()
一些django.utils中的和http、translation、text等相關的內容。
Django 3.0中刪除的功能
以下方法、屬性和設置被刪除了:
-
django.db.backends.postgresql_psycopg2
模塊 -
django.shortcuts.render_to_response()
方法 -
DEFAULT_CONTENT_TYPE
設置 -
HttpRequest.xreadlines()
方法 -
Field.from_db_value()
和Expression.convert_value()
方法 -
QuerySet.earliest()
和latest()
的field_name
關鍵字參數 -
django.utils.http.cookie_date()
方法 -
staticfiles
和admin_static
模板標簽庫 -
django.contrib.staticfiles.templatetags.staticfiles.static()
方法
總結
從版本說明中我們可以看出,Django3.0最核心的變化是支持基於ASGI的異步通信,其它細微的改動一般用戶基本感受不出來。
異步通信的功能據說是將django-channle這個外部庫納入進來,作為Django官方核心標准功能之一。無論如何,HTML5的websocket將可以直接和Django進行通信了。基於Django實現網頁聊天室、網頁QQ、網頁微信等實時通信應用將變得簡單,我們可以和長短輪詢說再見了。
(更多Django相關內容和最新變化,請關注我的官網www.liujiangblog.com,相關最新教學視頻也將第一時間發布!)