Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在引入Django通道时,我是否需要更改我的普通Django代码?_Django_Django Rest Framework_Django Channels_Daphne_Asgi - Fatal编程技术网

在引入Django通道时,我是否需要更改我的普通Django代码?

在引入Django通道时,我是否需要更改我的普通Django代码?,django,django-rest-framework,django-channels,daphne,asgi,Django,Django Rest Framework,Django Channels,Daphne,Asgi,您好,我是python领域的初学者,所以我仍在努力理解使用ASGI时的注意事项。我阅读了一些教程和文档,并在youtube上观看了一些视频。然而,我在某些方面不确定 我有一个使用Django+Django Rest框架的小型后端应用程序 我的代码非常简单,由框架中最常见的概念组成:视图、序列化器、模型、URL等。此外,我使用关系数据库 我的环境是: Python 3.8 Django 3 Django Rest框架3.11 现在,我需要添加对WebSocket的支持,并完成了Django频道

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

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

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

我的环境是:

  • Python 3.8
  • Django 3
  • Django Rest框架3.11
现在,我需要添加对WebSocket的支持,并完成了Django频道教程中描述的基本配置:

  • 我安装了Django通道2.4.0(Daphene 2.5.0)
  • 向已安装的应用程序添加“频道”
  • 我用一个空的ProtocolTypeRouter创建了一个routing.py文件
  • 我将ASGI_应用程序添加到我的settings.py中
  • 我将asgi.py文件配置为使用通道
  • 目前,我还没有配置任何通道层
  • 目前,我还没有创建任何WebSocket端点
在这些配置之后,runserver正在使用ASGI开发服务器,显然我的REST端点都在工作

一些问题:

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

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

  • 我是否可以仅使用ASGI以可靠和稳定的方式为普通HTTP和WebSockets请求提供服务?或者,是否建议使用WSGI为HTTP流量提供服务,只将WebSockets流量留给daphene

  • 关于同步代码,应该注意哪些方面


这些是我根据之前使用Django Channel 2的经验得出的答案

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

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

另一方面,
通道层
使用不同的方法,只提供异步版本。 当从同步代码发出调用时,需要使用async_to_sync包装器;例如:

from asgiref.sync import async_to_sync

async_to_sync(channel_layer.group_send)(
    group, {
        "type": 'data_received',
        "content": data,
    })
2)考虑到daphene是一台ASGI服务器,上述配置已经具备了在daphene中安全执行同步代码所需的所有功能?

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

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

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

拆分HTTP和WebSocket流量,因此:

  • 通过WSGI服务器运行标准HTTP请求
  • 仅将Daphne(或uvicorn)用于WSGI无法完成的事情,如WebSocket、HTTP长轮询或其他物联网协议

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

Marlon,您是单独使用django通道,还是同时使用可选通道层组件?目前,仅使用django通道,但很快我们将考虑使用Redis引入通道层。
ROOT_URLCONF = 'project.urls'