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
相关产品推荐
相关产品推荐

