Django中如何正确使用 redis & 如何在 Heroku 部署 Django时使用 Redis

文章目录

  • 问题起源:AsyncWebsocketConsumer 中的 channel_layer
  • 解决方案
    • 安装 & 启动 redis
    • 安装 channel-redis
    • 更新 settings.py 的 redis 设置
  • Heroku 部署
    • add-on 添加 Redis 组件
    • settings.py

问题起源:AsyncWebsocketConsumer 中的 channel_layer

  • 在构建 websocket 的过程中,我在 consumers.py 中的代码如下:
    Django中如何正确使用 redis & 如何在 Heroku 部署 Django时使用 Redis_第1张图片

  • 使用 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

  • 默认情况下,AsyncWebsocketConsumerchannel_layer 属性被设置为 None。你需要在你的配置中指定一个 channel layer。通常我们使用 Redis 作为后端来实现此功能。

解决方案

安装 & 启动 redis

  • 首先确保电脑中安装了 redis 并启动,如果你是 macos,那么进行如下操作:

    brew install redis
    
  • 以下是安装的 logs
    Django中如何正确使用 redis & 如何在 Heroku 部署 Django时使用 Redis_第2张图片

  • 启动:

    brew services start redis
    
  • 如果启动失败,使用上图中的命令进行启动:

    /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf
    

Django中如何正确使用 redis & 如何在 Heroku 部署 Django时使用 Redis_第3张图片

  • 成功启动后,会发现 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 组件

Django中如何正确使用 redis & 如何在 Heroku 部署 Django时使用 Redis_第4张图片

  • 在这里搜索并添加一个 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,python)