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?