Django Channels WebSocket /ws/stock/track/路径404错误求助
问题排查:Django Channels WebSocket 404 错误
问题现象
后端控制台返回404:
Not Found: /ws/stock/track/ [20/Feb/2024 19:09:12] "GET /ws/stock/track/?stockpicker=AAPL&stockpicker=AMGN HTTP/1.1" 404 2613
前端WebSocket连接失败,请求地址为ws://127.0.0.1:8000/ws/stock/track/?stockpicker=AAPL&stockpicker=AMGN
错误原因
你的WebSocket路由规则和前端请求的地址不匹配:
- 路由配置的正则是
r'ws/stock/(?P<room_name>\w+)/$',要求room_name是单词字符(字母、数字、下划线),并且路径必须以/结尾 - 但前端请求的地址是
/ws/stock/track/?xxx,track后面直接跟了查询参数?,没有/,不符合路由的/$结尾要求
解决方法
方法1:修改前端连接地址,保证路径以/结尾
调整JS代码里的WebSocket地址拼接逻辑,确保room_name后先加/再拼接查询参数:
const roomName = JSON.parse(document.getElementById('room-name').textContent) var queryString = window.location.search.substring(1) console.log(queryString) // 先加/再拼查询参数 const stockSocket = new WebSocket('ws://' + window.location.host + '/ws/stock/' + roomName + '/?' + queryString)
方法2:修改路由正则,允许路径后直接跟查询参数
如果不想改动前端代码,调整routing.py里的正则规则,去掉结尾的/限制:
from django.urls import re_path from . import consumers websocket_urlpatterns = [ # 去掉结尾的/$,允许路径后直接跟查询参数 re_path(r'ws/stock/(?P<room_name>\w+)', consumers.StockConsumer.as_asgi()), ]
若room_name可能包含非单词字符(如特殊符号),可把正则改为r'ws/stock/(?P<room_name>[^/]+)',匹配任意非/的字符。
额外检查项
- 确认
settings.py中已将channels添加到INSTALLED_APPS,且ASGI_APPLICATION正确指向backend.asgi.application - 用Daphne启动服务器(而非普通
runserver),确保ASGI协议正常处理:daphne backend.asgi:application - 检查Redis服务是否正常运行,
CHANNEL_LAYERS配置的地址和端口是否正确
内容的提问来源于stack exchange,提问作者chonkrdoggr
相关产品推荐
相关产品推荐

