下面咱们简单的来看看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参数逆向分析