前几天Django发布了 3.1版本的更新,作为一个半吊子Django开发者,个人觉得这次是真的值得说一说了。

3.1的更新最重要的是下面两个改动:

  • 支持异步views和middleware
  • ORM中JSONField所有数据库的支持

支持异步views和middleware

按照官方的说法,现在对于异步的支持已经扩展到views和middleware了,比如:

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

这确实是一个相当大的改动。我们以前如果想使用Python的异步来开发Web应用,一般的选择有下面几个:

  • Tornado
  • Sanic
  • FastAPI
  • aiohttp

我也曾用上面的一些框架开发过一些应用,比如学生时代开发的基于Tornado的全异步社区应用Minos(https://github.com/phith0n/minos)。但是说实话,在后面接触过Django敏捷开发以后,我是不会再想使用老的开发框架了,原因也很简单,Django提供的方法、ORM、生态能帮助我在极短的时间快速开发出自己想做的应用,这是其他Web框架所无法比拟的。

当然,不支持异步也是Django一直以来被诟病的地方之一,我们如果需要基于Django开发websocket等异步相关的功能,还需要借助Channels这样的工具。

Django在从2.x就已经开始在慢慢设计由同步转变成异步相关的功能了,只不过用户在编写view和middleware的时候还一直不能使用async方法。这次相当于官方补齐了这一块的缺陷。

但是话说回来,Django 3.1的“异步”其实仍然是一个不可用的状态,原因我觉得如下:

  • ORM、Cache等重要的功能仍无法使用异步方法,在异步中使用同步的IO,有可能反而导致效率出现一些问题
  • websocket等长连接场景仍然没有一个独立的解决方案(指不再使用channels)

另外,异步这个事情,我个人一直持保留意见,原因我曾在分享《XRay旅行记 - 从内部项目到社区项目的蜕变》这个幻灯片的时候也提到过:如果能完美地实现异步与协程,当然是美好的,但现实情况是大多数人驾驭不好这一块的内容,而且大量第三方库也没有兼容这一块的内容

所以我个人认为,Django走异步这条路,只要不影响现有的开发进程,我都是表示支持的,而且是迟早要走的路;至于异步对Django整体功能的优化,在没有完全解决长连接问题之前,都是影响不大的,我应该也暂时用不到。

ORM中JSONField所有数据库的支持

相比于异步这块的进展,我期待已久的反而是JSONField的支持。这个功能我从Django 2.x开始就一直在盯了,有图为证