Django3.0新鮮出爐!全面解讀新特性,ASGI真香實錘,不來了解一下?

真的機緣巧合!

寫這篇文章徹底是機緣巧合,想一想已經好長時間沒有關注過Django了,雖然Django一直霸佔着Python Web開發界的王座,可是因爲各類緣由自從使用Asyncio以來一直使用Aiohttp這個框架。碰巧由於以前寫了幾天的《2019逆向複習系列》,腦子裏充斥着「逆向」,「逆向」,「逆向」。今天想換換思路寫點其餘的文章,偶然間看到前兩天Django 3.0版本推出,簡單看了下Django 3.0的新特性,看到Django 3.0正式版本終於支持ASGI了,心裏真是一陣澎湃,當時放棄Django去選擇其餘的異步框架也是由於它不支持異步,如今它終於徹底擁抱異步了,我也就能夠重拾Django,嚐嚐鮮啦!

新特性解讀

下面咱們簡單的來看看Django 3.0的新特性,其中ASGI是最讓人激動的,咱們放在最後講。python

Python兼容性

Django雖然以前沒有支持異步開發,可是在Python版本支持方面,它一貫是比誰都積極,從Django 2.0版本剛推出開始,官方就已經宣佈中止對Python 2.X版本的支持了,那個時候纔是兩年前啊!而如今,Django 3.0正式推出,它只支持Python 3.6以上的版本,對於使用Python 3.5的各位大兄弟們,抱歉,Django 2.2.x系列是最後一個支持Python 3.5的系列。mysql

數據庫的支持

在數據庫支持方面,一方面Django 3.0將放棄對PostgreSQL 9.4版本和Oracle 12.1版本的支持。可是另外一方面Django 3.0將支持使用MariaDB 10.1或更高版本的數據庫。對於開發者來講,最初上手Django框架通常是Django+MySQL/PostgreSQL來搞Web,如今能夠藉此機會嘗試下MariaDB,相比於PostgreSQL,MariaDB更相似與MySQl,並且MariaDB相比MySQL來講會有更多的存儲引擎類型和稍微快一點的查詢效率,因此對於基於MySQL做爲存儲引擎的後端開發,能夠嘗試切換成MariaDB。更多的對比能夠參考mariadb-vs-mysql算法

PostgreSQL的排斥約束

新ExclusionConstraint類容許在PostgreSQL上添加排除約束。使用Meta.constraints選項將約束添加到模型 。 ExclusionConstraint定義類普通的約束定義相似sql

class ExclusionConstraint(*, name, expressions, index_type=None, condition=None)¶
複製代碼

一樣的,咱們也可使用Meta.constraints把約束加入Model數據庫

from django.contrib.postgres.fields import DateTimeRangeField, RangeOperators
from django.db import models
from django.db.models import Q

class Room(models.Model): # 建議房間模型
    number = models.IntegerField()

class Reservation(models.Model): # 創建預定模型
    room = models.ForeignKey('Room', on_delete=models.CASCADE) # 級聯外鍵
    timespan = DateTimeRangeField() # 新建兩個字段
    cancelled = models.BooleanField(default=False)

    class Meta: # 定義約束
        constraints = [
            ExclusionConstraint( # 排斥約束
                name='exclude_overlapping_reservations',
                expressions=[ # timespan字段不在函數範圍內排斥
                    ('timespan', RangeOperators.OVERLAPS),
                    ('room', RangeOperators.EQUAL),
                ],
                condition=Q(cancelled=False),
            ),
        ]
複製代碼

過濾器表達式¶

這個變更是在QuerySet過濾器中的,如今BooleanField能夠直接在QuerySet過濾器中使用輸出的表達式,而沒必要首先註釋,而後針對註釋進行過濾。express

模型字段選擇的枚舉

在以前的Django版本,咱們在model的field字段須要枚舉的時候一般須要這麼作django

from django.utils.translation import gettext_lazy as _

class Student(models.Model): # 定義模型

    class YearInSchool(models.TextChoices): # 定義TextChoices類
        FRESHMAN = 'FR', _('Freshman')
        SOPHOMORE = 'SO', _('Sophomore')
        JUNIOR = 'JR', _('Junior')
        SENIOR = 'SR', _('Senior')
        GRADUATE = 'GR', _('Graduate')

    year_in_school = models.CharField( # 引用TextChoices類做爲枚舉選擇
        max_length=2,
        choices=YearInSchool.choices,
        default=YearInSchool.FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {YearInSchool.JUNIOR, YearInSchool.SENIOR}
複製代碼

從上面能夠看出,Django中沒有特定的枚舉字段,須要咱們手動去指定,而在Django 3.0中,自定義枚舉類型TextChoices,IntegerChoices和Choices如今做爲一個的方式來定義Field.choices。爲文本和整數字段提供了類型TextChoices 和IntegerChoices類型。在 Choices類容許定義爲其餘具體的數據類型兼容的枚舉。這些自定義枚舉類型支持人類可讀的標籤,能夠經過枚舉或其成員上的屬性來翻譯和訪問這些標籤。舉個例子,上面的代碼咱們能夠這麼來寫:後端

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    GRADUATE = 'GR'
    YEAR_IN_SCHOOL_CHOICES = [
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
        (GRADUATE, 'Graduate'),
    ]
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {self.JUNIOR, self.SENIOR}
複製代碼

你們看,是否是方便了許多,如今有個特定的Choice字段來供咱們選擇,整個代碼的思路就更清晰了。bash

次要特性

上面列舉的是主要變更和新增的新特性,下面介紹的是次要的特性。服務器

django.contrib.admin¶
  • 增長了對admin_order_field屬性屬性,支持ModelAdmin.list_display。
  • 新ModelAdmin.get_inlines()方法容許根據請求或模型實例指定內聯。
  • Select2庫從4.0.3版本升級到4.0.7。
  • jQuery從3.3.1版本升級到3.4.1。
django.contrib.auth¶
  • 新增reset_url_token屬性,其中PasswordResetConfirmView容許指定顯示爲密碼重置URL組件的令牌參數。
  • 添加了BaseBackend類,以簡化身份驗證後端的自定義。
  • 添加了get_user_permissions()方法,相似於如今的get_group_permissions()方法。
  • createsuperuser如今變化爲當非交互模式下未提供相應的命令行參數時,退回到密碼和必填字段的環境變量。
  • REQUIRED_FIELDS如今支持ManyToManyField。
  • 新UserManager.with_perm()方法將返回具備指定權限的用戶。
  • PBKDF2密碼哈希器的默認迭代計數從150,000增長到180,000。
表格
  • 表單集能夠經過can_order設置ordering_widget屬性或覆蓋來控制在訂購表單時使用的小部件。
文件存儲
  • Storage.get_alternative_name()若是已經存在帶有上載名稱的文件,則新方法容許自定義生成文件名的算法。
國際
  • 增長了LANGUAGE_COOKIE_HTTPONLY,LANGUAGE_COOKIE_SAMESITE和LANGUAGE_COOKIE_SECURE參數來設置HttpOnly,SameSite以及Secure對語言的cookie標誌。這些設置的默認值和以前的版本相同。
  • 添加了對烏茲別克語的支持和翻譯。

有關於Django 3.0新特性的解讀就是這樣,具體更詳細的解讀你們能夠看看官方的News

重點關注ASGI

介紹完了Django 3.0新特性以後呢要重點關注ASGI了,要徹底理解ASGI恐怕一篇文章是不夠的,因此下次我會再出一篇文章來重點介紹一下ASGi,這篇咱們簡單瞭解下ASGi以及看看它在Django 3.0中是如何去使用的。

什麼是ASGI?

要想了解什麼是ASGI,那就要了解什麼是WSGI,要想了解什麼是ASGI,那就要了解什麼是CGI。

  • CGI就是(通用網關接口, Common Gateway Interface/CGI),舉個例子就是正常的客戶端發送HTTP請求到服務端,服務端通過某些請求處理,再構建出符合HTTP的響應返回,這個過程當中的處理程序就是CGI,能夠看下圖所示:
  • 瞭解了什麼是CGI以後,那什麼是WSGi呢?引用維基上的解釋爲,Web服務器網關接口(Python Web Server Gateway Interface,WSGI),其實做用和CGI的差很少,即在WSGI服務器和WSGI應用之間起調解做用, 一句話歸納,其實能夠說WSGI就是基於Python的以CGI爲標準作一些擴展。
  • 既然WSGi是這樣,那ASGi又是什麼呢?ASGI的A其實就是Async,也就是異步的意思,理解起來就是異步的WSGI,它產生的緣由是由於在現在Web環境愈來愈複雜的狀況下,有不少WSGI不支持的協議,例如WebSocket,HTTP2等等而且WSGI是基於同步的服務,所以針對這些狀況,Django團隊(哈哈,沒想到是他們吧!)獨創了ASGi的概念,也是由於他們不知足於Django基於WSGI的種種低效表現,ASGI模式將Django做爲原生異步應用程序運行,原有的WSGI模式將圍繞每一個Django調用運行單個事件循環,以使異步處理層與同步服務器兼容。

具體能夠淺顯的理解爲這樣:在ASGI中,將一個網絡請求劃分紅三個處理層面,最前面的一層,interface server(協議處理服務器),負責對請求協議進行解析,並將不一樣的協議分發到不一樣的Channel(頻道);頻道屬於第二層,一般能夠是一個隊列系統。頻道綁定了第三層的Consumer(消費者)。好比說,HTTP協議的頻道綁定了HTTP的消費者,當有新的HTTP請求過來時,interface server將該請求分發到HTTP頻道,HTTP 頻道綁定的HTTP消費者對該請求進行處理,將處理結果返回給HTTP頻道,最終傳回給客戶端。

Django+ASGI+Uvicorn實戰

ASGI既然是基於WSGI擴展開發的,那麼使用的方法和WSGI相似,咱們一樣須要一個application對象,而後使用應用服務器把這個對象啓動起來,就像使用Gunicorn/UWsgi啓動WSGI同樣,這樣咱們使用Uvicorn,Uvicorn是基於uvloop和httptools的ASGI服務器,它理論上是Python中最高性能的框架了,咱們首先下載它

pip install uvicorn
複製代碼

對於一個典型的Django項目,調用Uvicorn以下所示

uvicorn myproject.asgi:application
複製代碼

而後進程監聽一個8000端口,咱們就這樣很輕易的基於ASGI開發了Django的實戰項目了。


做者相關

號主介紹

多年反爬蟲破解經驗,AKA「逆向小學生」,沉迷數據分析和黑客增加不能自拔,虛名有CSDN博客專家和華爲雲享專家。

私藏資料

嘔心瀝血從浩瀚的資料中整理了獨家的「私藏資料」,公衆號內回覆「私藏資料」便可領取爬蟲高級逆向教學視頻以及多平臺的中文數據集

小學生都推薦的好文

2019年底逆向複習系列之今日頭條WEB端_signature、as、cp參數逆向分析

2019年底逆向複習系列之百度指數Data加密逆向破解

2019年底逆向複習系列之努比亞Cookie生成逆向分析

2019年底逆向複習系列之淘寶M站Sign參數逆向分析

相關文章
相關標籤/搜索