Django Channels не отправляет сообщение внутри блока except в задаче Celery

В настоящее время я столкнулся с проблемой, связанной с Django Channels и Websockets. У меня есть приложение, которое каким-то образом работает с файлами и Sharepoint. Выложен пример кода, в котором возникает дефект:


@shared_task(bind=True)
def upload_to_sharepoint_task(self, user_id: str, document_type: str, upload_file: str, filename: str) -> None:
    """Uploads a file to SharePoint."""
    task_id = self.request.id

    try:
        upload_to_sharepoint(user_id, document_type, upload_file, filename)

        print(f"Task {task_id} completed successfully.")

        async_to_sync(get_channel_layer().group_send)(task_id, {
            "type": "send_task_status",
            "message": {'task_id': task_id, 'status': "SUCCESS", }
        })
    except BackendError as e:

        print(f"Task {task_id} failed with error: {str(e)}")
        async_to_sync(get_channel_layer().group_send)(task_id, {
            "type": "send_task_status",
            "message": {'task_id': task_id, 'status': "FAILURE", 'error': str(e)}
        })

Если метод upload_to_sharepoint не выбрасывает исключение, все работает просто отлично - сообщение отправляется в группу и, через WebSocket, передается Клиенту. Однако, если я попытаюсь смоделировать ситуацию, когда исключение будет выброшено (например, явно выбросив BackendException), сообщение об ошибке будет выведено в консоль, но WebSocket не получит никакого сообщения ни Клиент.

Мой TaskConsumer:

class TaskConsumer(WebsocketConsumer):

    def connect(self):        
        self.task_id = self.scope['url_route']['kwargs']['task_id']

        # Join the task_id group
        async_to_sync(self.channel_layer.group_add)(self.task_id, self.channel_name)

        self.accept()

    def disconnect(self, close_code):
        # Leave the task_id group
        async_to_sync(self.channel_layer.group_discard)(
            self.task_id, self.channel_name
        )

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json["message"]

        print(f"Task {self.task_id} received message: {message}")

        async_to_sync(self.channel_layer.group_send)(
            self.task_id, {"type": "send_task_status", "message": message}
        )


    def send_task_status(self, event):
        message = event['message']

        self.send(text_data=json.dumps({"message": message}))

У кого-нибудь есть идеи, что может быть не так и как я могу передать информацию о неудачной загрузке обратно клиенту через используемый WebSocket?

Вернуться на верх