• Django 3.0版本


    这里将介绍一下Django 3.0的版本说明!!!!!!!


    一,Python兼容性

    1,Django 3.0支持Python 3.6、3.7、3.8和3.9(自3.0.11起)。强烈建议并仅正式支持每个系列的最新版本。
    2,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的排斥约束

    1,新ExclusionConstraint类允许在PostgreSQL上添加排除约束。使用Meta.constraints选项将约束添加到模型。
    2,ExclusionConstraint定义类普通的约束定义类似

    class ExclusionConstraint(*, name, expressions, index_type=None, condition=None) 

    3,同样的,我们也可以使用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过滤器中使用输出的表达式,而不必首先注释,然后针对注释进行过滤。


    五,模型字段选择的枚举

    1,在之前的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}

    2,从上面可以看出,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} 

    六,ASGI(重点)

    1,什么是ASGI。

    • 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频道,最终传回给客户端。

    2,ASGI支持。

    • Django 3.0通过提供对作为ASGI应用程序运行的支持,开始了使Django具有完全异步功能的旅程。
    • 这是对我们现有的WSGI支持的补充。Django打算在可预见的将来为这两者提供支持。但是,异步功能仅适用于在ASGI下运行的应用程序。
    • 在此阶段,异步支持仅适用于外部ASGI应用程序。内部一切保持同步。尚不支持异步中间件,视图等。但是,您可以在Django应用程序周围使用ASGI中间件,从而可以将Django与其他ASGI框架结合使用。除非您想开始尝试异步代码,否则无需切换应用程序。
    • 请注意,作为此更改的副作用,Django现在知道异步事件循环,并将阻止您从异步上下文中调用标记为“异步不安全”的代码(例如ORM操作)。如果您以前使用的是异步代码中的Django,则可能会在操作不正确时触发它。如果看到SynchronousOnlyOperation错误,请仔细检查代码,并将所有数据库操作移至同步子线程中。

    3,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的实战项目了。

    七,其他特性。

    1,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。

    2,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。

    3,表格 表单集可以通过can_order设置ordering_widget属性或覆盖来控制在订购表单时使用的小部件。
    4,文件存储 Storage.get_alternative_name()如果已经存在带有上载名称的文件,则新方法允许自定义生成文件名的算法。
    5,国际

    • 增加了LANGUAGE_COOKIE_HTTPONLY,LANGUAGE_COOKIE_SAMESITE和LANGUAGE_COOKIE_SECURE参数来设置HttpOnly,SameSite以及Secure对语言的cookie标志。这些设置的默认值和之前的版本相同。
    • 添加了对乌兹别克语的支持和翻译。

    6,缓存 add_never_cache_headers()然后 never_cache()将private 指令添加到Cache-Control标题中。

  • 相关阅读:
    iconv 文件编码相互转换
    MySQL 字符编码
    MySQL there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause同时创建多个更新当前时间戳字段 解决方法
    PHP 输出日志到文件 DEMO
    Nginx http -> https 跳转后 POST 丢失
    SSH SCP 远程密钥登录配置和服务器间的文件传输
    Mac 安装 7zip
    git pull There is no tracking information for the current branch.
    MacOS 安装配置 Laravel
    Mac OS 安装 MySQL5.7
  • 原文地址:https://www.cnblogs.com/qianniao2122/p/14205379.html
Copyright © 2020-2023  润新知