下面咱們簡單的來看看Django 3.0的新特性,其中ASGI是最讓人激動的,咱們放在最後講。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。算法
新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 3.0新特性的解讀就是這樣,具體更詳細的解讀你們能夠看看官方的News
介紹完了Django 3.0新特性以後呢要重點關注ASGI了,要徹底理解ASGI恐怕一篇文章是不夠的,因此下次我會再出一篇文章來重點介紹一下ASGi,這篇咱們簡單瞭解下ASGi以及看看它在Django 3.0中是如何去使用的。
要想了解什麼是ASGI,那就要了解什麼是WSGI,要想了解什麼是ASGI,那就要了解什麼是CGI。
具體能夠淺顯的理解爲這樣:在ASGI中,將一個網絡請求劃分紅三個處理層面,最前面的一層,interface server(協議處理服務器),負責對請求協議進行解析,並將不一樣的協議分發到不一樣的Channel(頻道);頻道屬於第二層,一般能夠是一個隊列系統。頻道綁定了第三層的Consumer(消費者)。好比說,HTTP協議的頻道綁定了HTTP的消費者,當有新的HTTP請求過來時,interface server將該請求分發到HTTP頻道,HTTP 頻道綁定的HTTP消費者對該請求進行處理,將處理結果返回給HTTP頻道,最終傳回給客戶端。
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參數逆向分析