引入Django频道时,我需要更改常规的Django代码吗?

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

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

我的代码非常简单,由框架中最常见的概念组成:视图,序列化器,模型,URL等。此外,我使用关系数据库。

我的环境是这样:

  • Python 3.8
  • Django 3
  • Django Rest Framework 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?

  • 在什么地方应该特别注意同步代码?

iCMS 回答:引入Django频道时,我需要更改常规的Django代码吗?

这些是我根据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?

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

分离HTTP和WebSocket流量,因此:

  • 通过WSGI服务器运行标准HTTP请求
  • 仅将达芙妮(或uvicorn)用于WSGI无法做的事情,例如WebSocket,HTTP长轮询或其他IoT协议

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

本文链接:https://www.f2er.com/2070800.html

大家都在问