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

Python Django WebSocket连接失败求助:路由配置存疑

排查Django WebSocket连接404问题的步骤

1. 确认ASGI应用是否正确挂载WebSocket路由

Django Channels的WebSocket路由不会走普通urls.py,必须在ASGI入口文件(通常为asgi.py)中配置。检查你的asgi.py是否正确整合了routing.py的规则:

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
import your_app.routing  # 替换为实际的应用名称

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": URLRouter(
        your_app.routing.websocket_urlpatterns
    ),
})

如果缺失websocket对应的URLRouter配置,所有WebSocket请求会被当作普通HTTP请求处理,直接返回404。

2. 检查路由正则表达式的匹配逻辑

你的路由规则r'room/(?P<group>\w+)/$'中,\w仅匹配字母、数字和下划线。虽然你的group参数是哈希值(十六进制字符)符合\w范围,但需注意:

  • 正则末尾的/$要求请求URL必须以斜杠结尾,如果前端请求时遗漏斜杠,会匹配失败
  • 可以将正则改为r'room/(?P<group>[0-9a-fA-F]+)/$',更精准匹配十六进制哈希值,避免意外不匹配

3. 验证Channels核心配置是否完整

检查settings.py中的关键配置:

# 确保channels已加入INSTALLED_APPS
INSTALLED_APPS = [
    # ...其他应用
    'channels',
]

# 指向正确的ASGI应用
ASGI_APPLICATION = 'your_project.asgi.application'  # 替换为实际项目路径

如果未配置ASGI_APPLICATION,Django会默认使用WSGI处理请求,WebSocket请求根本无法进入Channels的处理流程。

4. 测试WebSocket请求的转发情况

用wscat工具直接发起测试请求,排除前端代码的干扰:

wscat -c ws://192.168.3.12:8000/room/74b38da601c8d3bce0dcfd269d72fc4c0c5c63d7abe0d74599a6c0cc39a110f9/

如果仍然返回404,说明请求未到达Channels路由层,需重点排查ASGI配置和服务器启动方式。

5. 检查Consumer类的基础结构

确保ChatConsumer类正确继承并实现了核心方法,避免因类结构错误导致路由加载失败:

from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.group_name = self.scope['url_route']['kwargs']['group']
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard(
            self.group_name,
            self.channel_name
        )

如果Consumer存在语法错误或未正确继承,服务器启动时通常会抛出异常日志,可直接查看日志定位问题。

6. 确认开发服务器支持ASGI

如果使用python manage.py runserver,需确保Django版本≥3.0(该版本开始开发服务器支持ASGI)。若版本不兼容,需用Daphne启动服务器:

daphne your_project.asgi:application

用Daphne启动后再测试WebSocket连接,避免开发服务器不支持ASGI的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:34:51