Categories
程式開發

Django 3.0 版本正式發布,支持異步功能


2019年12月2日,Django官方博客發布了Django 3.0的發布說明,Django 3.0 正式版真的來啦!

Django是一款用於開發Web應用程序的高級Python框架,Pinterest,Instagram和NASA等網站都是使用該框架來編寫的。雖然Django一直佔據著Python Web開發界的頭把交椅,但其不支持異步一直困擾著開發者,而Django 3.0正式版本終於支持ASGI了,這不免讓開發者興奮。

Django 3.0的新功能

除了前文提到的支持ASGI,Django 3.0還涵蓋了很多新的功能,下面我們就詳細解讀一下這些新功能。

Python版本支持

Django對Python版本的支持一向是很積極的,Django 3.0只支持Python 3.6以上的版本,即Python 3.6、3.7和3.8,Django 2.2.X系列成為了最後一個支持Python 3.5的系列。

數據庫支持

Django 3.0在數據庫支持方面的最大亮點是正式支持了Maria開發DB 10.1及更高版本。對於開發者來說,又多了一種數據庫選擇,且MariaDB與MySQL類似,但是存儲引擎類型更多,查詢效率更快。

在支持新數據庫的同時,Django 3.0版本也放棄了對某些數據庫版本的支持。 2019年12月,Django將結束對PostgreSQL 9.4的上游支持,轉而支持PostgreSQL 9.5及更高版本;2021年7月將結束對Oracle 12.1的上游支持,正式支持Oracle 12.2和18c。另外,需要注意的是,Django 2.2對Oracle 12.1的支持也將在2022年4月結束。

ASGI支持

ASGI支持可以說是開發者最期待的Django 3.0的新功能。 ASGI是異步網關協議接口,是介於網絡協議服務和Python應用之間的標準接口,能夠處理多種通用的協議類型,包括HTTP,HTTP2和WebSocket。

Django 3.0對ASGI模式的支持使得Django 可以作為原生異步應用程序運維,原有的WSGI模式將圍繞每個Django調用運行單個事件循環,以使異步處理層與同步服務器兼容。

在這個改造的過程中,每個特性都會經歷以下三個實現階段:

  • Sync-only,只支持同步,也就是當前的情況
  • Sync-native,原生同步,同時帶有異步封裝器
  • Async-native,原生異步,同時帶同步封裝器

需要注意的是,在異步事件循環時,Django會阻止調用異步上下文中標記為“async unsafe”的代碼,例如ORM操作。如果直接使用異步代碼之前的Django,那麼很可能就會觸發這個問題,如果發生了SynchronousOnlyOperation錯誤,需要仔細檢查代碼並將所有數據庫操作移至同步子線程中。

PostgreSQL的排斥約束

新ExclusionConstraint類允許在PostgreSQL上添加排除約束。使用Meta.constraints選項將約束添加到模型 。

模型字段選擇的枚舉

Django 3.0可以自定義枚舉類型TextChoices、IntegerChoices和Choices來定義Field.choices。其中,TextChoices和IntegerChoices類型用於文本和整數字段,Choices類允許定義其他具體數據類型的兼容枚舉。

以上這些自定義枚舉類型幾乎包含了所有用戶可讀的標籤,同時可以通過枚舉或者成員的屬性來翻譯和訪問這些標籤。更多詳細信息和示例,請參見枚舉類型

不再支持的功能

除了增加新功能,Django 3.0版本也棄用了一些舊功能,包括但不限於:

  • django.db.backends.postgresql_psycopg2模塊
  • django.shortcuts.render_to_response()
  • DEFAULT_CONTENT_TYPE設置
  • HttpRequest.xreadlines()
  • 支持context的Field.from_db_value()和 Expression.convert_value()
  • field_name的關鍵字參數QuerySet.earliest()和 latest()
  • ForceRHRGIS功能
  • django.utils.http.cookie_date()
  • staticfiles和admin_static的模板標籤庫
  • django.contrib.staticfiles.templatetags.staticfiles.static;

版本兼容性問題

Django 3.0發布之後,很多開發者都會關心Django 3.0對之前版本的兼容性。官方給出的建議是:第三方應用程序的開發者最好放棄使用Django 2.2之前的版本。開發者可以使用 python -Wd 運行包進行測試,如果出現了棄用警告,那麼就要及時修復,以便應用程序能夠與Django 3.0兼容。

除了版本兼容問題,關於數據庫後端、安全、默認值等具體兼容性問題,可以查看此處