You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>[^/]+)',匹配任意非/的字符。

额外检查项

  1. 确认settings.py中已将channels添加到INSTALLED_APPS,且ASGI_APPLICATION正确指向backend.asgi.application
  2. 用Daphne启动服务器(而非普通runserver),确保ASGI协议正常处理:
    daphne backend.asgi:application
    
  3. 检查Redis服务是否正常运行,CHANNEL_LAYERS配置的地址和端口是否正确

内容的提问来源于stack exchange,提问作者chonkrdoggr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:34:58