真的机缘巧合!


写这篇文章完全是机缘巧合,想想已经好长时间没有关注过Django了,虽然Django一直霸占着Python Web开发界的王座,但是由于各种原因自从使用Asyncio以来一直使用Aiohttp这个框架。碰巧因为之前写了几天的《2019逆向复习系列》,脑子里充斥着“逆向”,“逆向”,“逆向”。今天想换换思路写点其他的文章,偶然间看到前两天Django 3.0版本推出,简单看了下Django 3.0的新特性,看到Django 3.0正式版本终于支持ASGI了,内心真是一阵澎湃,当时放弃Django去选择其他的异步框架也是因为它不支持异步,现在它终于完全拥抱异步了,我也就可以重拾Django,尝尝鲜啦!

新特性解读

下面我们简单的来看看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的系列。

数据库的支持

在数据库支持方面,一方面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定义类普通的约束定义类似

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 Qclass 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过滤器中使用输出的表达式,而不必首先注释,然后针对注释进行过滤。

模型字段选择的枚举

在之前的Django版本,我们在model的field字段需要枚举的时候通常需要这么做

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字段来供我们选择,整个代码的思路就更清晰了。

次要特性

上面列举的是主要变动和新增的新特性,下面介绍的是次要的特性。

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参数逆向分析

Django3.0新鲜出炉!全面解读新特性,ASGI真香实锤,不来了解一下?相关推荐

  1. EasyMoney 绿色免费 家庭财务软件v1.0 新鲜出炉~~~

    EasyMoney 家庭财务软件v1.0 新鲜出炉~~~ EasyMoney 财务软件使用帮助 前言:系统概述         EasyMoney是一款专为家庭或个人量身打造的在线账务管理系统.帮助个 ...

  2. WebKit华丽转身:欧朋浏览器8.0新鲜出炉

    摘要:欧朋浏览器产品总监冯嘉林身上的担子不轻,因为欧朋从Presto转投到WebKit之后,新产品的发布是一个关键性的时间节点.业界许多人都在关注他们新一代浏览器产品.究竟欧朋浏览器8.0如何?且看下 ...

  3. 一文掌握明年物联网传感器市场!2022中国AIoT产业全景图谱报告新鲜出炉

    来源:传感器专家网 物联网产业是传感器应用最广泛的领域之一,研发新型传感器,做传感器市场,都不能不考虑物联网产业的需求. 2021年随着COVID-19 病毒的存在已常态化,防疫抗疫进入了拉锯阶段:波 ...

  4. 2019数据技术嘉年华饕餮盛宴“菜单”新鲜出炉,只等你来!

    时光荏苒,第八届数据技术嘉年华大会的精彩演讲还历历在目,第九届数据技术嘉年华已进入倒计时阶段.本次大会于2019年11月15日-16日在北京新云南皇冠假日酒店盛大开启,期待现场与大家共畅技术之美. 本 ...

  5. 2018年《DevOps 现状报告》新鲜出炉:行业脉动与团队发展指导一览

    DORA 与 Google Cloud 合作发布的 2018 年<DevOps 现状报告>已经新鲜出炉,今年的报告中有哪些新的结论?你又应当如何根据这些结论,促使你的团队发展为精英水平? ...

  6. Silverlight 3正式版新鲜出炉

    [IT168资讯]Silverlight 3正式版(版本号3.0.40624.0)已经新鲜出炉,将于今日正式发布.今日在See the light网站将举行线上发布活动,播放视频Keynote和技术演 ...

  7. Vue vben admin - 新鲜出炉的高颜值管理后台UI框架,基于 Vue3 和 Ant Design Vue

    基于Vue3.0 / Vite / Ant Design 等火热开源项目构建,新鲜出炉,值得关注. 关于 Vue vben admin Vue Vben Admin 是一个基于 Vue3.0.Vite ...

  8. 五万字前端面试宝典——前端百题斩(上)新鲜出炉

    从2021年5月9号开始更新<前端百题斩>,目前终于取得了阶段性成果,<前端百题斩>上册已经更新完毕,内容包括JS基础篇.浏览器篇.网络篇,共计50个章节,5万多字.关注公众号 ...

  9. 计算机小高考成绩,2018“小高考”成绩新鲜出炉!据分析难度又大了

    原标题:2018"小高考"成绩新鲜出炉!据分析难度又大了 大家关注的小高考成绩 已经出来啦 时隔大半个月 鲤鱼姐姐依然记得 那天大家自信满满的笑容 相信童鞋们都可以取得理想成绩哦 ...

最新文章

  1. webdriver(python)学习笔记一
  2. Nginx(四)------nginx 负载均衡
  3. Codeforces 500
  4. BZOJ1084 [SCOI2005]最大子矩阵 动态规划
  5. 微软Expression Blend功能介绍
  6. Shiro身份认证授权原理
  7. 个人数据在暗网的交易价格是多少?
  8. 火狐浏览器摄像头权限怎么开启 火狐浏览器摄像头权限开启的方法
  9. Android Butterknife
  10. ajax怎样带值,ajax携带状态值
  11. 《2021企业数智化转型升级创新服务企业》榜重磅发布
  12. 信息学奥赛一本通:1135:配对碱基链
  13. word突然不能保存只能另存为
  14. 在职场遇到一个总是说话带刺的同事怎么相处?
  15. h61 nvme硬盘_移动硬盘怎么选?看完这篇不踩坑
  16. 获取HTML中文本框的值并进行比较两者的大小
  17. 技术分享 | 基于 Alertmanager 告警系统的改造
  18. 《失控》摘录与读后感
  19. 记录一次前途迷茫的选择
  20. CC00027.elasticsearch——|HadoopElasticSearch.V27|——|ELK.v27|集群|QueryDSL|高亮|

热门文章

  1. linux logrotate 配置说明
  2. Linux内核日志查看之dmesg命令简介
  3. 满意度调查系统,是一面能让医院提升自身服务镜子
  4. x210ii DM9000驱动调试成功-基于x210ii/s5pv210开发板
  5. hive删除表数据方法
  6. 翻译 | ORB-SLAM: a Versatile and Accurate Monocular SLAM System(ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统)
  7. 分发糖果的程序设计代码_糖果为您设计的颤动交互引擎
  8. ESP8266-Arduino远程控制继电器(开关)
  9. uniapp开发云打包详细流程(包含安卓Android和苹果IOS)
  10. 抖音文字视频怎么制作?教你用AE一键制作酷炫拽翻转文字视频!