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()
全面转向pathlib
从3.1后,Django将广泛使用pathlib来处理文件路径,而不是os.path模块。settings.py中使用startproject命令生成的根目录将使用 pathlib.Path。STATICFILES_DIRS和FileSystemStorage也将支持pathlib.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 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的变化,你最喜欢哪个呢?