Django 3.1版本正式发布,主要变化有哪些?

Django 3.1版本已于8月4日正式发布了,里面又有不少激动人心的变化,让Django变得更强大了。小编我今天就带大家看看有哪些主要变化吧?

Python版本兼容性

Django 3.1支持Python 3.6, 3.7和3.8版本。官网建议更新到最新版本。

对异步请求视图和中间件的支持

从3.1起,Django将提供支持完整的异步请求(request),包括:

  • Asynchronous views (异步视图)

  • Asynchronous middleware (异步中间件)

  • Asynchronous tests and test client (异步测试和测试客户端)

如果你希望使用异步视图,需要先使用 async def声明,如下所示:

async def my_view(request):
    await asyncio.sleep(0.5)
    return HttpResponse('Hello, async world!')

无论你是在 WSGI 或 ASGI 模式下运行,Django都支持所有异步功能,不过在 WSGI 模式下使用异步代码将会有些性能上的损失。

你还可以随意混合使用异步和同步视图,中间件和测试。异步功能不会影响同步代码的执行速度,也不会对已有项目产生明显的影响。

Django的ORM,缓存层和其他长时间运行网络调用的代码尚不支持异步访问。我们希望在即将发布的版本中增加对它们的支持。异步视图是理想的选择,但是,如果您在视图内进行大量的API或HTTP调用,则现在可以本地并行执行所有这些HTTP调用,以大大加快视图的执行速度。

小编注:一般建议使用同步视图函数,只有在有需要的情况下使用异步视图。小编后面会分享具体案例,欢迎关注。

新增JSONField,支持更多数据库作为后端

Django现在新增models.JSONField, forms.JSONField并且支持在更多数据库上运行。这两个字段都支持使用自定义JSON编码器和解码器。以前json格式的数据仅适用于PostgreSQL数据库。

存储的json格式的数据可以使用Django的ORM语法进行链式查询,如下所示:

from django.db import models


class ContactInfo(models.Model):
    data = models.JSONField()


ContactInfo.objects.create(data={
    'name': 'John',
    'cities': ['London', 'Cambridge'],
    'pets': {'dogs': ['Rufus', 'Meg']},
})
ContactInfo.objects.filter(
    data__name='John',
    data__pets__has_key='dogs',
    data__cities__contains='London',
).delete()

更多阅读:

Django ORM中原生JSONField的使用方法


全面转向pathlib

从3.1后,Django将广泛使用pathlib来处理文件路径,而不是os.path模块。settings.py中使用startproject命令生成的根目录将使用 pathlib.Path。STATICFILES_DIRS和FileSystemStorage也将支持pathlib.Path。

更多阅读:

为什么你要在Django项目中开始使用pathlib而不是os.path处理拼接文件路径


国际化

从3.1后,模板中负责标记需要翻译字符串的标签{% trans %}和{% blocktrans %}将分别被更名为{% translate %}和{% blocktranslate %}。不过短期内较早的trans 和blocktrans模板标签依然可以使用。

<title>{% translate "This is the title." %}</title>
<title>{% translate myvar %}</title>


{% blocktranslate %}
This string will have {{ value }} inside.
{% endblocktranslate %}

更多阅读

Django基础(38): 如何设置支持多语种网站及国际化

其它小变化

  • Django admin新增空白过滤器django.contrib.admin.EmptyFieldListFilter,并在大屏幕上多了侧边导航

  • settings.py新增PASSWORD_RESET_TIMEOUT 选项,可以密码重置链接有效期(以秒计算),将替代PASSWORD_RESET_TIMEOUT_DAYS

  • django.contrib.humanize模块intword可以支持负数

  • AbstractUser的first_name的最大长度由30变到150个字符

Django 3.1的变化,你最喜欢哪个呢? 欢迎留言。

大江狗

2020.8

如果你订阅公众号过多,为了第一时间能阅读我们的原创技术干货,请一定解读加关注并设为星标。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值