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

Docker部署Django项目时WebSocket报404错误求助

Django + Channels + Docker WebSocket 404 问题排查与修复

以下是针对你遇到的WebSocket 404错误的核心排查点及修复方案:

1. CHANNEL_LAYERS 配置错误

你的settings.py中CHANNEL_LAYERS存在两处问题:

  • hosts格式错误:channels_redis的hosts接受字符串或元组,而非字典格式
  • 冗余的ROUTING配置:Channels 4.x版本已不再需要在CHANNEL_LAYERS中指定路由,路由规则已通过ASGI文件的ProtocolTypeRouter配置

修正后的CHANNEL_LAYERS:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": ["redis://redis:6379/1"],  # 修正为字符串格式
        },
        # 移除多余的ROUTING配置项
    },
}

2. WebSocket路由语法规范问题

你使用了已废弃的django.conf.urls.url,建议统一使用Django 3.x+推荐的re_path(正则路由)或path(精确匹配路由),避免潜在的兼容性问题。

修正后的config/routing.py:

from django.urls import re_path
from apps.test.consumers import TestConsumer

websocket_urlpatterns = [
    re_path(r'^ws/test/$', TestConsumer.as_asgi()),   
]

3. Uvicorn启动命令优化

当前启动命令缺少明确的端口和工作目录指定,虽然不影响功能,但可能引发路径歧义。建议补充完整参数:

修正后local.yml中的django服务命令:

command: uvicorn config.asgi:application --host 0.0.0.0 --port 8000 --chdir /app

4. 请求地址笔误检查

你提到的请求地址为ws:://localhost:8000/ws/test/,存在双冒号笔误,正确格式应为ws://localhost:8000/ws/test/,该笔误可能直接导致连接失败。

5. 版本兼容性确认

确保channels_redis版本与Channels 4.0.0兼容,建议使用channels_redis>=4.0.0,避免因依赖版本不匹配导致的WebSocket服务异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:23:24