4

您好我是python世界的初学者,所以我仍然在尝试了解使用ASGI时的注意事项。我阅读了一些教程和文档,并在 youtube 上观看了一些视频。但是,我在某些方面不确定。

我有一个使用 Django + Django Rest Framework 的小型后端应用程序。

我的代码非常琐碎,由框架中最常见的概念组成:视图、序列化器、模型、url 等。另外,我使用了关系数据库。

我的环境是这样的:

  • 蟒蛇 3.8
  • 姜戈 3
  • Django 休息框架 3.11

现在,我需要添加对 WebSockets 的支持,并且我做了 Django Channels 教程中描述的基本配置:

  • 我安装了 Django Channels 2.4.0 (Daphene 2.5.0)
  • 向 INSTALLED_APPS 添加了“频道”
  • 我创建了一个带有空 ProtocolTypeRouter 的 routing.py 文件
  • 我将 ASGI_APPLICATION 添加到我的 settings.py
  • 我将 asgi.py 文件配置为使用通道
  • 目前,我还没有配置任何通道层
  • 目前,我还没有创建任何 WebSocket 端点

在这些配置之后,运行服务器正在使用 ASGI 开发服务器,显然我的 REST 端点都在工作。

一些问题:

  • 考虑到我所有的代码都是同步的,难道没有必要对其进行任何调整吗?

  • 考虑到它是一个 ASGI 服务器,上面的这个配置已经完成了我的同步代码在 daphene 中安全执行所需的所有魔法?

  • 我能否以可靠和稳定的方式仅使用 ASGI 来处理正常的 HTTP 和 WebSockets 请求?或者,是否建议使用 WSGI 服务 HTTP 流量,只将 WebSockets 流量留给 daphene?

  • 关于同步代码,究竟应该注意哪些地方?

4

1 回答 1

1

这些是我根据以前使用 Django Channels 2 的经验得出的答案......

1)考虑到我所有的代码都是同步的,是不是有必要对其进行任何调整?

您可以安全地保留现有的同步代码:无需调整;只需确保调用 django-channels API 的“同步版本”(即 SyncConsumer 而不是 AsyncConsumer)。

另一方面,Channel Layers使用不同的方法,并且仅提供异步版本。当从同步代码发出调用时,您需要使用 async_to_sync 包装器;例如:

from asgiref.sync import async_to_sync

async_to_sync(channel_layer.group_send)(
    group, {
        "type": 'data_received',
        "content": data,
    })

2) 考虑到它是一个 ASGI 服务器,上面的这个配置已经完成了我的同步代码在 daphene 中安全执行所需的所有魔法吗?

唯一缺少的详细信息是(在设置文件中):

ROOT_URLCONF = 'project.urls'

3) 我能否以可靠和稳定的方式仅使用 ASGI 服务正常的 HTTP 和 WebSockets 请求?或者,是否建议使用 WSGI 服务 HTTP 流量,只将 WebSockets 流量留给 daphene?

使用 Channels 2,您可以安全地选择对 HTTP 和 WebSockets 请求使用 Daphne,因为 Daphne 将在 HTTP 和 WebSocket 之间自动协商;这是我通常在我的项目中做的事情。

拆分 HTTP 和 WebSocket 流量,因此:

  • 通过 WSGI 服务器运行标准 HTTP 请求
  • 仅将 Daphne(或 uvicorn)用于 WSGI 不能做的事情,例如 WebSockets、HTTP 长轮询或其他 IoT 协议

是可能的,但完全是可选的。

于 2020-07-14T21:01:14.890 回答