最有深度的研究笔记由程序员界最会排版的追星族运营
文章信息
作者: Lateautumn4lin 来源:云爬虫技术研究笔记
AKA 逆向小学生
郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。
「
真的机缘巧合!
」
写这篇文章完全是机缘巧合,想想已经好长时间没有关注过 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
过滤器表达式¶
这个变动是在 QuerySet过滤器中的,现在 BooleanField可以直接在 QuerySet过滤器中使用输出的表达式,而不必首先注释,然后针对注释进行过滤。
模型字段选择的枚举
在之前的 Django版本,我们在 model的 field字段需要枚举的时候通常需要这么做
from django.utils.translation import gettext_lazy as _
从上面可以看出, Django 中没有特定的枚举字段,需要我们手动去指定,而在 Django 3.0 中,自定义枚举类型 TextChoices , IntegerChoices 和 Choices 现在作为一个的方式来定义 Field.choices 。 为文本和整数字段提供了类型 TextChoices 和 IntegerChoices 类型。 在 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,可以看下图所示:
了解了什么是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中最高性能的框架了,我们首先下载它
1. `pip install uvicorn`
对于一个典型的 Django项目,调用 Uvicorn如下所示
1. `uvicorn myproject.asgi:application`
然后进程监听一个8000端口,我们就这样很轻易的基于 ASGI开发了 Django的实战项目了。
号主介绍
多年反爬虫破解经验,AKA “逆向小学生” ,沉迷数据分析和黑客增长不能自拔,虚名有CSDN博客专家和华为云享专家。
私藏资料
呕心沥血从浩瀚的资料中整理了独家的 “私藏资料” ,公众号内回复 “私藏资料” 即可领取爬虫高级逆向教学视频以及多平台的中文数据集
小学生都 推荐的好文
2019年末逆向复习系列之知乎登录formdata加密逆向破解
2019年末逆向复习系列之今日头条WEB端_signature、as、cp参数逆向分析
爸爸,请问 您有 在看文章吗?
本文分享自微信公众号 - 云爬虫技术研究笔记(cloudcrawler)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。