问题起源: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
文章来源:https://www.toymoban.com/news/detail-524657.html
- 成功启动后,会发现
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 }, }, }
Heroku 部署
add-on 添加 Redis 组件
文章来源地址https://www.toymoban.com/news/detail-524657.html
- 在这里搜索并添加一个
Redis
应用,这让你可以在 Heroku 的服务器上可以使用 redis 服务(但是要付费)
settings.py
- 如果你要将 Django 部署到 Heroku,那么要将
settings.py
中有关CHANNEL_LAYERS
的部分改成:CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [os.environ.get("REDIS_URL", 'redis://localhost:6379')], # 如果你的Redis运行在不同的主机或端口,请调整这里的设置 }, }, }
- 因为在 Heroku 上运行 Django Channels 和 Redis 时,你需要确保你的设置正确指向 Heroku Redis 的 URL (通常通过环境变量
REDIS_URL
提供)。所以不能直接写死成"hosts": [('127.0.0.1', 6379)]
到了这里,关于Django中如何正确使用 redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!