Обработчик сообщений канала Django websocket не выполняется после вызова в веб-хуке
Задача - Установить и запустить django asgi, иметь конечную точку websocket. Принять запрос webhook в django и отправить udpates в websocket, чтобы все клиенты, слушающие websocket, были уведомлены.
Views.py
from django.shortcuts import render
from django.http import JsonResponse
from channels.layers import get_channel_layer
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
def websocket_notifications(request):
return render(request, 'my_app/notifications.html')
@csrf_exempt
@require_POST
def send_message_to_websocket(request):
message = request.POST.get('message', 'Hello, WebSocket clients!')
# Get the channel layer
channel_layer = get_channel_layer()
# Broadcast the message to the WebSocket group
channel_layer.group_send(
'notifications_notification_room', # The group name (matches your consumer)
{
'type': 'chat_message', # Type that the consumer will listen for
'message': message
}
)
return JsonResponse({'status': 'Message sent', 'message': message})
consumers.py
import json
import logging
import asyncio
from channels.generic.websocket import AsyncWebsocketConsumer
# Set up a logger
logger = logging.getLogger(__name__)
class MyWebSocketConsumer(AsyncWebsocketConsumer):
async def connect(self):
logger.debug(f"WebSocket connection attempt from {self.channel_name}")
print(f"WebSocket connection attempt from {self.channel_name}")
self.room_name = 'notification_room'
self.room_group_name = f'notifications_{self.room_name}'
# Log to confirm the WebSocket joins the group
logger.debug(f"Joining group: {self.room_group_name}")
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
# Start a task to send messages every 2 seconds
# self.message_task = asyncio.create_task(self.send_periodic_messages())
async def disconnect(self, close_code):
logger.debug(f"WebSocket connection closed for {self.channel_name} (Close code: {close_code})")
# Cancel the periodic message task
if hasattr(self, 'message_task'):
self.message_task.cancel()
# Leave the room group
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
async def receive(self, text_data):
logger.debug(f"Received message from WebSocket client: {text_data}")
# Receive message from room group
async def chat_message(self, event):
print('in chat message event')
logger.debug(f"Received message from group: {event['message']}")
message = event['message']
# Send message to WebSocket client
await self.send(text_data=json.dumps({
'message': message
}))
async def send_periodic_messages(self):
# This method sends a message to all WebSocket clients every 2 seconds
while True:
await asyncio.sleep(2) # Wait for 2 seconds
message = "This is an automatic message" # Change this to any message you want
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message
}
)
logger.debug(f"Sent periodic message: {message}")
Когда я пытаюсь использовать webhook, управление никогда не переходит в функцию chat_message, но если я использую send_periodic_messages в том же файле для автоматизации, все работает нормально. Я вижу, что websocket всегда подключается, и я вижу json-ответ от обработчика views.py webhook. Где же тогда проблема?
Все Все Все Все Все Все