看了网上的几个简单例子,一步一步做,但无一成功。都连不上websocket。

后来按一个视频教程的操作步骤来做,成功了。差别在于视频教程中加了

 pip install daphne  

和setting.py中

连不上的表现:

前端报错:

WebSocket connection to 'ws://127.0.0.1:8000/ws/some_path/' failed: 
WebSocket is closed now.

后端报错:

Not Found: /ws/some_path/
"GET /ws/some_path/ HTTP/1.1" 404 2445

 --------------------------------

原因:简单教程中默认你在开发环境中使用python manage.py runserver。理论上来说。如果你的Django项目仅使用InMemoryChannelLayer(不用Redis),且在本地开发环境中只用Django自带的runserver命令进行测试,那么通常情况下不需要额外安装Daphne或uvicorn。

InMemoryChannelLayer:

  • 这是一种内存中的通道层,主要用于开发和测试。
  • 它简单、易用,不需要外部的ASGI服务器来支持。
  • Django的runserver命令已经内置了对InMemoryChannelLayer的支持。

那为什么我在本地上runserver却还要安装Daphne呢?先不追究,暂时先按照这个方法操作。

这个问题在开发环境没有遇到,估计部署到服务器上也是会遇到的。

-------------------------

ASGI 服务器能够处理 WebSocket 等协议,而 Django 自带的 WSGI 服务器(runserver)只能处理 HTTP 协议。

------------------------

pip install channels 跟 pip install channels[daphne] 的区别:后者除了安装 channels 之外,还会额外安装 Daphne作为 ASGI 服务器如果你计划将项目部署到生产环境中,使用 pip install channels[daphne] 会更加方便,因为它直接提供了一个可用于生产的 ASGI 服务器。

注意:pip install channels daphne 并不等效于 pip install "channels[daphne]" ,前者是将channelsdaphne 是作为两个独立的包进行安装的,没有考虑 channels 在与 daphne 一起使用时可能需要的额外关联配置项、依赖项。后者同时考虑并安装可能需要的额外依赖项,确保 channelsdaphne 的集成工作良好。

在大多数情况下,如果你计划使用 channels 并且希望它与 daphne 良好地协作,建议使用 pip install "channels[daphne]"

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部