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",
    
]
Вернуться на верх