Django 频道 VS Django 3.0 / 3.1?

Dav*_* D. 14 python django django-channels

有人可以澄清Django Channels Project和新的Django 本机异步支持之间的差异或互补性吗?

据我了解,Django-Channels 是一个在 Django 之外启动的项目,然后开始集成到核心 Django 中。但这项工作的当前状态对我来说仍然令人困惑。

例如,今天我使用的是 Django 2.2,我想为我的项目添加 WebSocket 支持。我是不是该:

  • 升级到最新的 Django 版本?
  • 使用 Django 频道包?
  • 两个动作都做吗?

Tim*_*Tim 22

今天我使用的是 Django 2.2,我想为我的项目添加 WebSocket 支持。

如果你想为你的应用添加 websocket 支持,目前你不需要升级到 django 3.0。Django 2.2 plus 频道可以做到这一点 - 目前是最好的前进方式。(尽管如果您没有充分的理由不升级到 django 3.0 绝对没有坏处)。我将尝试在此答案中进一步解释原因。

据我了解,Django-Channels 是一个在 Django 之外启动的项目,然后开始集成到核心 Django 中。但这项工作的当前状态对我来说仍然令人困惑。

是的,我的理解是,渠道最初是作为 Django 核心开发人员之一(Andrew Godwin,他也在 Django 3.0 中带来异步更改方面发挥了重要作用)的一个项目开始的。如果您只是安装 Django,它不会自动包含在内,但它正式成为 django 项目的一部分,并且自 2016 年 9 月以来一直存在(请参阅此处)。它现在是 2.4 版,因此是一个成熟且稳定的项目,可用于将 websockets 添加到您的 django 应用程序。

那么 Django 3.x 和 async 发生了什么?

虽然频道添加了一种向 django 应用程序添加一些异步功能的方法,但 Django 的核心仍然是同步的。正在逐步引入的“异步”项目解决了这个问题。这里要注意的关键是它是逐步引入的。Django 由几层组成:

  • WSGI 服务器(实际上不是 django 的一部分):处理实际接受 HTTP 请求的协议
  • Base Handler:它接受从服务器传递给它的请求,并确保它通过中间件和 url 配置发送,以便我们最终得到一个 django 请求对象和一个视图来传递它。
  • 视图层(它做任何你告诉它的事情)
  • ORM 以及您在 Django 中获得的所有其他可爱的东西,我们可以从视图中调用它们。

现在要充分受益于异步,我们真的需要所有这些层都是异步的,否则不会真正有任何性能优势。这是一个相当大的项目,因此它正在逐步推出:

  • 随着 django 3.0 的发布,真正添加的只是与 ASGI 服务器通信的能力(而不仅仅是 WSGI 服务器)。
  • 当 Django 3.1 发布(预计 2020 年 8 月)时,预计会有异步中间件和视图的功能。
  • 最后在 django 3.2,甚至 4.0 中,我们将在整个 Django 中上下获得异步功能。

一旦我们到达最后一点,可能值得考虑将 Django 的异步功能用于诸如 web-sockets 之类的东西,但目前我们甚至无法利用我们现在可以处理 ASGI 和 WSGI 的事实服务器。您可以将 Django 与 ASGI 服务器一起使用,但没有意义,因为基本处理程序仍然是同步的。

TLDR

  • Django 通道添加了一种处理 HTTP 之外的协议的方法,并将集成添加到 django 的会话框架和身份验证框架等内容中,因此可以轻松地将 websockets 之类的内容添加到您的 django 项目中。它已经完成,您今天就可以开始使用它了!!
  • 原生异步支持是对 Django 核心的根本性重写。这是一个进展中的工作。这是非常令人兴奋的,但暂时还没有准备好真正受益。

在去年的 djangoCon 上有一个很好的演讲,概述了异步 django 的计划。你可以在这里查看