Directorio de artículos
Origen del problema: channel_layer en AsyncWebsocketConsumer
-
En el proceso de construcción
websocket
, miconsumers.py
código es el siguiente:
-
uso
channel_layer.group_add
:group_add
Canales es un mecanismo para agregar un canal dado a un grupo específico.- En Canales, un grupo se puede ver como una
WebSocket
colecció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
Redis
es: Al intentar acceder al método, su valor es .'NoneType' object has no attribute 'group_add'
self.channel_layer
group_add
None
-
De forma predeterminada,
AsyncWebsocketConsumer
elchannel_layer
atributo se establece enNone
. Debe especificar uno en su configuraciónchannel layer
. Por lo general, lo usamosRedis
como backend para implementar esta funcionalidad.
solución
Instalar e iniciar redis
-
Primero asegúrese de que esté instalado
redis
e iniciado en su computadora, si es asímacos
, haga lo siguiente:brew install redis
-
Se instalan los siguientes
logs
-
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
- Después de un inicio exitoso, encontrará que el puerto
redis
se ejecuta localmente6379
Instalar canal-redis
channels-redis
El 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.py
Agregue el siguiente código en cualquier lugar deCHANNEL_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
- 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.py
relevanteCHANNEL_LAYERS
de 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_URL
proporcionada a través de una variable de entorno). Así que no puedes simplemente escribirlo hasta la muerte."hosts": [('127.0.0.1', 6379)]