Django Channels配置Redis通道层报WebSocket已关闭错误如何解决
报错根因
使用channels_redis.core.RedisChannelLayer作为通道层后端时报WebSocket is already in CLOSING or CLOSED state.错误,切换InMemoryChannelLayer后功能正常,且未启动本地Redis服务的前提下,核心触发原因是:Django Channels无法和配置中指定的127.0.0.1:6379Redis实例建立连接,WebSocket握手后通道层通信失败,服务端主动断开连接,前端就会抛出对应关闭状态报错。
排查解决步骤
- 优先启动本地Redis服务
当前配置里指定Redis地址为本地6379端口,未启动服务是最直接的故障点,按对应操作系统启动Redis即可:- Windows:在Redis安装目录下执行
redis-server.exe redis.windows.conf,如果是msi安装版也可以直接在系统服务列表找到Redis服务手动启动 - macOS(Homebrew安装):终端执行
brew services start redis - Debian/Ubuntu系Linux:终端执行
sudo systemctl start redis-server
启动后执行redis-cli ping校验,返回PONG即代表Redis服务正常运行在默认端口。
- Windows:在Redis安装目录下执行
- 校验依赖完整性
确认环境中已安装适配版本的channels-redis包,执行pip list | grep channels-redis可查看已安装版本,未安装的话执行pip install channels-redis完成安装,注意版本要和本地Django、Django Channels版本匹配,避免版本兼容问题。 - 验证通道层连通性
启动Django shell执行以下测试代码,确认Redis通道层工作正常:
代码正常执行无报错、打印import channels.layers from asgiref.sync import async_to_sync channel_layer = channels.layers.get_channel_layer() async_to_sync(channel_layer.send)('test_channel', {'type': 'test.message'}) response = async_to_sync(channel_layer.receive)('test_channel') print(response){'type': 'test.message'}即代表通道层配置生效,重启ASGI/Django服务后重新访问聊天页面即可恢复正常。 - 额外排查项
如果Redis启动后仍报错,依次检查:本地6379端口是否被防火墙拦截、Redis是否修改了默认端口/配置了连接密码、Redis实际监听地址是否和配置中hosts参数填写的地址一致,根据实际情况调整CHANNEL_LAYERS配置即可。
内容的提问来源于stack exchange,提问作者ProgrammingWithTasos
相关产品推荐
相关产品推荐

