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

Stella981
• 阅读 370

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

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

最有深度的研究笔记由程序员界最会排版的追星族运营

文章信息

作者: Lateautumn4lin  来源:云爬虫技术研究笔记

AKA 逆向小学生

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

郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。

真的机缘巧合!

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兼容性

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,相比于 PostgreSQLMariaDB更类似与 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

过滤器表达式¶

这个变动是在 QuerySet过滤器中的,现在 BooleanField可以直接在 QuerySet过滤器中使用输出的表达式,而不必首先注释,然后针对注释进行过滤。

模型字段选择的枚举

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

from django.utils.translation import gettext_lazy as _

从上面可以看出, Django 中没有特定的枚举字段,需要我们手动去指定,而在 Django 3.0 中,自定义枚举类型 TextChoicesIntegerChoicesChoices 现在作为一个的方式来定义 Field.choices 。 为文本和整数字段提供了类型 TextChoicesIntegerChoices 类型。 在 Choices 类允许定义为其他具体的数据类型兼容的枚举。 这些自定义枚举类型支持人类可读的标签,可以通过枚举或其成员上的属性来翻译和访问这些标签。 举个例子,上面的代码我们可以这么来写:

class Student(models.Model):

大家看,是不是方便了许多,现在有个特定的 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,可以看下图所示:

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

  • 了解了什么是CGI之后,那什么是WSGI呢?引用维基上的解释为,Web服务器网关接口(Python Web Server Gateway InterfaceWSGI),其实作用和CGI的差不多,即在WSGI服务器和WSGI应用之间起调解作用,
    一句话概括,其实可以说WSGI就是基于Python的以CGI为标准做一些扩展。

  • 既然WSGi是这样,那ASGI又是什么呢?ASGIA其实就是Async,也就是异步的意思,理解起来就是异步的WSGI,它产生的原因是因为在如今Web环境越来越复杂的情况下,有很多WSGI不支持的协议,例如WebSocketHTTP2等等并且WSGI是基于同步的服务,因此针对这些情况,Django团队(哈哈,没想到是他们吧!)首创了ASGI的概念,也是因为他们不满足于Django基于WSGI的种种低效表现,ASGI模式将Django作为原生异步应用程序运行,原有的WSGI模式将围绕每个Django调用运行单个事件循环,以使异步处理层与同步服务器兼容。

具体可以浅显的理解为这样:在 ASGI中,将一个网络请求划分成三个处理层面,最前面的一层, interface server(协议处理服务器),负责对请求协议进行解析,并将不同的协议分发到不同的 Channel(频道);频道属于第二层,通常可以是一个队列系统。频道绑定了第三层的 Consumer(消费者)。比如说, HTTP协议的频道绑定了 HTTP的消费者,当有新的 HTTP请求过来时, interface server将该请求分发到 HTTP频道, HTTP频道绑定的 HTTP消费者对该请求进行处理,将处理结果返回给 HTTP频道,最终传回给客户端。

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

Django+ASGI+Uvicorn实战

ASGI既然是基于 WSGI扩展开发的,那么使用的方法和 WSGI类似,我们同样需要一个 application对象,然后使用应用服务器把这个对象启动起来,就像使用 Gunicorn/ UWsgi启动 WSGI一样,这样我们使用 UvicornUvicorn是基于 uvloophttptoolsASGI服务器,它理论上是 Python中最高性能的框架了,我们首先下载它

    1.  `pip install uvicorn`

   
     
   
   
   

对于一个典型的 Django项目,调用 Uvicorn如下所示

    1.  `uvicorn myproject.asgi:application`

   
     
   
   
   

然后进程监听一个8000端口,我们就这样很轻易的基于 ASGI开发了 Django的实战项目了。

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

号主介绍

多年反爬虫破解经验,AKA “逆向小学生” ,沉迷数据分析和黑客增长不能自拔,虚名有CSDN博客专家和华为云享专家。

私藏资料

呕心沥血从浩瀚的资料中整理了独家的 “私藏资料” ,公众号内回复 “私藏资料” 即可领取爬虫高级逆向教学视频以及多平台的中文数据集

小学生都 推荐的好文

2019年末逆向复习系列之知乎登录formdata加密逆向破解

2019年末逆向复习系列之今日头条WEB端_signature、as、cp参数逆向分析

2019年末逆向复习系列之百度指数Data加密逆向破解

2019年末逆向复习系列之努比亚Cookie生成逆向分析

2019年末逆向复习系列之淘宝M站Sign参数逆向分析

2019年末,来一发基于Hexo自建博客生态指南!

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

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

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

爸爸,请问 在看文章吗?

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

本文分享自微信公众号 - 云爬虫技术研究笔记(cloudcrawler)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这