文章目录
- 问题起源:AsyncWebsocketConsumer 中的 channel_layer
- 解决方案
- 安装 & 启动 redis
- 安装 channel-redis
- 更新 settings.py 的 redis 设置
问题起源:AsyncWebsocketConsumer 中的 channel_layer
-
在构建
websocket
的过程中,我在consumers.py
中的代码如下:
-
使用
channel_layer.group_add
:group_add
是 Channels 的一种机制,用于将给定的 channel 添加到特定的 group 中。- 在 Channels 中,一个 group 可以被看作是一组监听某个特定事件的
WebSocket
连接集合。当你想向这些连接发送相同的消息时,可以直接通过这个 group 发送,而不需要单独地向每个连接发送。 - 例如,你可能有多个用户正在观看同一个直播房间,他们的 WebSocket 连接都应该加入到与该房间对应的 group 中。然后,当发生了某个事件(如:有新的聊天消息或者转录)时,你只需向这个 group 发送一次消息,所有在这个 group 中的用户都会收到这个消息。
-
由于我没有设定
Redis
,因此报错信息为:'NoneType' object has no attribute 'group_add'
指的是self.channel_layer
在尝试访问group_add
方法时,其值为None
。 -
默认情况下,
AsyncWebsocketConsumer
的channel_layer
属性被设置为None
。你需要在你的配置中指定一个channel layer
。通常我们使用Redis
作为后端来实现此功能。
解决方案
安装 & 启动 redis
-
首先确保电脑中安装了
redis
并启动,如果你是macos
,那么进行如下操作:brew install redis
-
以下是安装的
logs
-
启动:
brew services start redis
-
如果启动失败,使用上图中的命令进行启动:
/opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf
- 成功启动后,会发现
redis
运行在本地的6379
端口
安装 channel-redis
- 需要安装
channels-redis
包才能使用 Redis channel layer:
pip install channels_redis
更新 settings.py 的 redis 设置
- 在
settings.py
中随便找个地方加上下述代码CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 6379)], # Update this if your Redis runs on a different host or port }, }, }