@David5

Не прилетают сообщения по websocket из celery?

Добрый день, подскажите пожалуйста, почему если, я запускаю ф-цию в который по ws отпправляет не как таску celery,
то все робит, если так
@shared_task
def test_update():
    status = Status_Cheq.objects.get(code='pay')
    Cheq.objects.filter(id=4059237).update(status=status)
    send_cheq_websocket(cheq='4059237', method="update")


def test(request):
    test_update.delay()
    return JsonResponse({'status':'ok'})


то уже не долетает, я так понимаю что-то с контекстом в celery
consumer.py

class ChatConsumer(WebsocketConsumer):
    def connect(self):

        self.room_group_name = 'cheq'

        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name, 
            self.channel_name)

        self.accept()
        self.send(text_data=simplejson.dumps({
            'type': 'connections_established', 
            'message': 'Соединение уставновлено'
        }))


    def receive(self, text_data):
        text_data_json = simplejson.loads(text_data)
        message = text_data_json['message']

        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message, 
            }
        )

    def chat_message(self, event):
        message = event['message']
        method = event['method']
        self.send(text_data=simplejson.dumps({
            'type': 'chat',
            'message': message, 
            'method': method,
        }))


asgi.py
application = ProtocolTypeRouter({
    'http': get_asgi_application(), 
    'websocket': AuthMiddlewareStack(
        URLRouter(
            cheque.routing.websocket_urlpatterns
        )
    )
})


def send_message_to_group(group_name, message, method):
    channel_layer = get_channel_layer()

    async_to_sync(channel_layer.group_send)(
        group_name,
        {
            'message': message, 
            'method' : method,
            'type': 'chat_message'
        }
    )


def send_cheq_websocket(cheq, method):
    """
    отправить чек по websocket
    status: ['add', 'update']
    """
    .......
    какой-то код
    .......
    group_name = 'cheq' 
    send_message_to_group(group_name, message, method)
  • Вопрос задан
  • 65 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Скорее всего потому, что таски Celery выполняются в фоне отдельным процессом, в котором нет и быть не может ни цикла событий, обрабатывающего websocket'ы, ни самих соединений с клиентами.
Ответ написан
Комментировать
@David5 Автор вопроса
если кому нужно, я решил так
с этого
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels.layers.InMemoryChannelLayer'
    }
}

пересел на это
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('redis', 6379)],
        },
    },
}

теперь все соощения летают в redise и не теряеются в памяти
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы