Django3.0 前瞻 支持異步通信


最近兩年,Django的版本號提升得特別快,2.0還沒有多久,很快就要到3.0了。

讓我們先看看官方的路線圖和時間表:

1

版本號 發布日期 停止更新日期 停止維護日期
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過濾操作中直接使用輸出布爾值的表達式,而不用先聚合再過濾。

模型字段可選項的枚舉

新增枚舉類TextChoicesIntegerChoicesChoices ,它們都是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字段允許使用對稱的中間表

  • AvgSum聚合功能現在支持distinct參數,可以去重。

  • 新增SmallAutoField字段,類似AutoField字段,區別在於前者只允許一個較小的值范圍,比如從1到32767,這樣會更安全一點。

  • AutoFieldBigAutoField以及 SmallAutoField分別繼承了IntegerFieldBigIntegerFieldSmallIntegerField,所以其系統檢查和驗證器也相應分別繼承。

  • 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() 方法

  • staticfilesadmin_static模板標簽庫

  • django.contrib.staticfiles.templatetags.staticfiles.static() 方法

總結

從版本說明中我們可以看出,Django3.0最核心的變化是支持基於ASGI的異步通信,其它細微的改動一般用戶基本感受不出來。

異步通信的功能據說是將django-channle這個外部庫納入進來,作為Django官方核心標准功能之一。無論如何,HTML5的websocket將可以直接和Django進行通信了。基於Django實現網頁聊天室、網頁QQ、網頁微信等實時通信應用將變得簡單,我們可以和長短輪詢說再見了。

(更多Django相關內容和最新變化,請關注我的官網www.liujiangblog.com,相關最新教學視頻也將第一時間發布!)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM