Django: стек Celery signal, Redis Channel и AsyncWebsocket не работает
Я пытаюсь запустить функцию WebSocket из моего celery Signal, используя каналы redis.
Итак, вот мой AsyncWebsocket:
class Consumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_group_name = 'test' # Ensure consistent group name
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
print(f"Consumer {self.channel_name} joined group {self.room_group_name}") # Debugging line
await self.accept()
def chat_message(self, event):
message = event['message']
print(f"Chat message received: {message}")
self.send(text_data=json.dumps({
'type':'chat',
'message':message
}))
Это мой сигнал:
async def send_chat_message(task_id, message):
channel_layer = get_channel_layer()
group_name = f"teste"
# Send message to the WebSocket group
await channel_layer.group_send(
group_name,
{
'type': 'chat_message',
'message': message
}
)
@task_success.connect
def task_success_handler(sender, result, **kwargs):
message = f"Task {task_id} has completed successfully!"
async_to_sync(send_chat_message)(task_id, message)
print(message)
А это моя конфигурация redis:
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('redis', 6379)],
},
},
}
Примечание: я использую docker, поэтому хост - «redis», а также я уверен, что мой контейнер django может взаимодействовать с контейнером Redis, потому что когда я использую Consumer, монитор redis выдает:
1731094047.426342 [0 192.168.96.6:47094] "EVAL" "\n local backed_up = redis.call('ZRANGE', ARGV[2], 0, -1, 'WITHSCORES')\n for i = #backed_up, 1, -2 do\n redis.call('ZADD', ARGV[1], backed_up[i], backed_up[i - 1])\n end\n redis.call('DEL', ARGV[2])\n " "0" "asgispecific.d7702f4e3ed345e39497687e16c7ebd5!" "asgispecific.d7702f4e3ed345e39497687e16c7ebd5!$inflight"
1731094047.426476 [0 lua] "ZRANGE" "asgispecific.d7702f4e3ed345e39497687e16c7ebd5!$inflight" "0" "-1" "WITHSCORES"
1731094047.426485 [0 lua] "DEL" "asgispecific.d7702f4e3ed345e39497687e16c7ebd5!$inflight"
1731094047.426685 [0 192.168.96.6:47094] "BZPOPMIN" "asgispecific.d7702f4e3ed345e39497687e16c7ebd5!" "5"
1731094047.435198 [0 192.168.96.6:47104] "ZADD" "asgi:group:test" "1731094047.433636" "specific.d7702f4e3ed345e39497687e16c7ebd5!565251dda3294a369190ccbad0eb8515"
1731094047.435539 [0 192.168.96.6:47104] "EXPIRE" "asgi:group:test" "86400"
А когда я отправляю сообщение aka вызываю функцию в manage.py shell:
1731094160.374366 [0 192.168.96.6:42798] "ZREMRANGEBYSCORE" "asgi:group:teste" "0" "1731007760"
1731094160.375050 [0 192.168.96.6:42798] "ZRANGE" "asgi:group:teste" "0" "-1"
Итак, мой вопрос заключается в том, почему chat_message не срабатывает?
Я пробовал отлаживать с помощью отпечатков, но единственное, что не выводится, это print(f"Chat message received: {message}")
из Consumer.
Я попробовал использовать монитор redis-cli, чтобы проверить, получаю ли я соединения или нет.
Я использую правильную конфигурацию?
INSTALLED_APPS = [
"daphne",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django_celery_beat",
"django_extensions",
"rest_framework_simplejwt.token_blacklist",
"drf_yasg",
"apps.common",
"apps.user_app",
"apps.task_app",
"apps.api",
]