Django Channels 4.0.0无法连接WebSocket服务器问题求助
无法连接Django Channels WebSocket服务器问题
问题描述
按照官方文档搭建了一个小型Django Channels服务器,使用WebSocket King测试时,始终无法连接到ws://127.0.0.1:8000/chat/。启动Django服务器无报错,尝试将Channels版本降级至3.0.5并在INSTALLED_APPS中添加channels,问题仍未解决。
相关配置文件
Settings.py
INSTALLED_APPS = [ 'daphne', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', #Custom apps 'user_auth', 'core', ] ASGI_APPLICATION = 'buddies.asgi.application'
asgi.py
import os from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter from channels.security.websocket import AllowedHostsOriginValidator from django.core.asgi import get_asgi_application from django.urls import path from core.consumers import EchoConsumer os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'buddies.settings') django_asgi_app = get_asgi_application() application = ProtocolTypeRouter({ "http": django_asgi_app, "websocket": AllowedHostsOriginValidator( AuthMiddlewareStack( URLRouter([ # path("chat/admin/", AdminChatConsumer.as_asgi()), path("chat/", EchoConsumer.as_asgi()), ]) ) ), })
consumers.py(位于core应用内)
# it is inside the core app from channels.consumer import SyncConsumer class EchoConsumer(SyncConsumer): def websocket_connect(self, event): self.send({ "type": "websocket.accept", }) def websocket_receive(self, event): self.send({ "type": "websocket.send", "text": event["text"], })
排查建议
- 确认启动方式:必须使用Daphne启动服务,可执行命令
daphne buddies.asgi:application,或确保使用Django 3.0+版本的python manage.py runserver(新版本会自动调用Daphne)。 - 检查ALLOWED_HOSTS配置:在
settings.py中添加ALLOWED_HOSTS = ['127.0.0.1', 'localhost'],避免AllowedHostsOriginValidator因Origin不匹配拒绝连接。 - 临时关闭Origin验证:注释掉asgi.py中的
AllowedHostsOriginValidator,直接使用AuthMiddlewareStack包裹URLRouter,测试是否能正常连接,排除Origin验证导致的问题。 - 验证消费者路径:确认
core.consumers.EchoConsumer的导入路径正确,core应用已在INSTALLED_APPS中注册。 - 检查版本兼容性:确保Channels版本与Django版本匹配,比如Channels 4.x要求Django 3.2及以上版本。
- 查看服务器日志:启动服务后观察控制台输出,查看是否有WebSocket连接相关的错误信息,如路径匹配失败、权限异常等。
- 检查端口占用:确认8000端口未被其他程序占用,可尝试更换端口(如8001)重新测试。
内容的提问来源于stack exchange,提问作者Deepanshu Joshi
相关产品推荐
相关产品推荐

