Django Channels WebSocket连接异常:404错误及连接关闭问题排查
搞定Django Channels的WebSocket 404错误
兄弟,你的问题核心是路径不匹配,再加上几个小配置细节没到位,我一步步给你说怎么修:
1. 先改前端的连接路径(最关键的一步)
你后端routing.py里配置的WebSocket路径是/ws/chat/,但前端JS里写的是/chat/——少了ws前缀,服务器肯定找不到对应的路由,直接返回404了!
把JS代码里的连接地址改成这样:
var myWebSocket = new WebSocket("ws://" + window.location.host + "/ws/chat/");
2. 清理后端路由里的冗余代码
你的routing.py里有一行import routing as route,但你根本没用到这个导入,而且自己的文件也叫routing.py,很容易搞出循环导入的问题,直接删掉就行。修改后的routing.py应该是这样:
from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter from django.conf.urls import url from consumers import ChatConsumer websocket_urlpatterns = [ url(r'^ws/chat/$', ChatConsumer), ] application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( websocket_urlpatterns ) ), })
3. 确保用对了ASGI服务器
Django Channels不能依赖普通的runserver(虽然新版本Django会自动切换,但保险起见),得用专门的ASGI服务器比如Daphne或者Uvicorn启动:
# 用Daphne启动 daphne chatsys.asgi:application # 或者用Uvicorn uvicorn chatsys.asgi:application --host 0.0.0.0 --port 8000
另外,别忘了把daphne加到settings.py的INSTALLED_APPS最前面:
INSTALLED_APPS = [ 'daphne', # 你的其他APP,比如django.contrib.admin之类的 ]
4. 最后检查依赖安装
确保你已经装了Channels和ASGI相关的包:
pip install channels daphne
如果改完还不行,就去看服务器日志,或者用浏览器开发者工具的Network标签,看看WebSocket请求的具体路径和响应信息,应该就能定位到剩下的问题了。
内容的提问来源于stack exchange,提问作者Sam B.
相关产品推荐
相关产品推荐

