Cómo usar redis correctamente en Django y cómo usar Redis cuando Heroku implementa Django

Origen del problema: channel_layer en AsyncWebsocketConsumer

  • En el proceso de construcción websocket, mi consumers.pycódigo es el siguiente:
    inserte la descripción de la imagen aquí

  • uso channel_layer.group_add:

    • group_addCanales es un mecanismo para agregar un canal dado a un grupo específico.
    • En Canales, un grupo se puede ver como una WebSocketcolección de conexiones que escuchan un evento en particular. Cuando desee enviar el mismo mensaje a estas conexiones, puede enviarlo directamente a través de este grupo en lugar de enviarlo a cada conexión individualmente.
    • Por ejemplo, puede tener varios usuarios viendo la misma sala en vivo, y todas sus conexiones WebSocket deben agregarse al grupo correspondiente a esa sala. Luego, cuando ocurre un evento (como un nuevo mensaje de chat o una transcripción), solo necesita enviar un mensaje a este grupo una vez, y todos los usuarios de este grupo recibirán este mensaje.
  • Como no lo configuré , el mensaje de error Redises: Al intentar acceder al método, su valor es .'NoneType' object has no attribute 'group_add'self.channel_layergroup_addNone

  • De forma predeterminada, AsyncWebsocketConsumerel channel_layeratributo se establece en None. Debe especificar uno en su configuración channel layer. Por lo general, lo usamos Rediscomo backend para implementar esta funcionalidad.

solución

Instalar e iniciar redis

  • Primero asegúrese de que esté instalado redise iniciado en su computadora, si es así macos, haga lo siguiente:

    brew install redis
    
  • Se instalan los siguienteslogs
    inserte la descripción de la imagen aquí

  • puesta en marcha:

    brew services start redis
    
  • Si el inicio falla, use el comando en la figura anterior para comenzar:

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

inserte la descripción de la imagen aquí

  • Después de un inicio exitoso, encontrará que el puerto redisse ejecuta localmente6379

Instalar canal-redis

  • channels-redisEl paquete debe instalarse para usar la capa de canal de Redis:
    pip install channels_redis
    

Actualice la configuración de redis en settings.py

  • settings.pyAgregue el siguiente código en cualquier lugar de
    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
            },
        },
    }
    

despliegue de heroku

complemento agregar componentes de Redis

inserte la descripción de la imagen aquí

  • Busque y agregue una aplicación aquí Redis, que le permite usar el servicio redis en el servidor de Heroku (pero tiene que pagar)

configuración.py

  • Si está implementando Django en Heroku, cambie la parte settings.pyrelevante CHANNEL_LAYERSde a:
    CHANNEL_LAYERS = {
          
          
        'default': {
          
          
            'BACKEND': 'channels_redis.core.RedisChannelLayer',
            'CONFIG': {
          
          
                "hosts": [os.environ.get("REDIS_URL", 'redis://localhost:6379')],  # 如果你的Redis运行在不同的主机或端口,请调整这里的设置
            },
        },
    }
    
  • Porque cuando ejecuta Django Channels y Redis en Heroku, debe asegurarse de que su configuración apunte correctamente a la URL de Heroku Redis (generalmente REDIS_URLproporcionada a través de una variable de entorno). Así que no puedes simplemente escribirlo hasta la muerte."hosts": [('127.0.0.1', 6379)]

おすすめ

転載: blog.csdn.net/qq_42902997/article/details/131560283