Django + websocket 连不上
看了网上的几个简单例子,一步一步做,但无一成功。都连不上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]" ,前者是将channels
和 daphne
是作为两个独立的包进行安装的,没有考虑 channels
在与 daphne
一起使用时可能需要的额外关联配置项、依赖项。后者同时考虑并安装可能需要的额外依赖项,确保 channels
和 daphne
的集成工作良好。
在大多数情况下,如果你计划使用 channels
并且希望它与 daphne
良好地协作,建议使用 pip install "channels[daphne]"
。