Как правильно настроить каналы и сокеты в django

Я пытаюсь реализовать каналы websocket и django. На фронтенде у меня react, а на бекенде django.

Я установил channels и добавил его в INSTALLED_APPS в настройках, а также добавил в settings.py

ASGI_APPLICATION = 'VideoScreen.routing.application'
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels.layers.InMemoryChannelLayer',
    },
}

Маршрутизация осуществляется следующим образом:

websocket_urlPattern = [
    path("ws/device-key/", DeviceCodeConsumer.as_asgi()),
]
application = ProtocolTypeRouter(
    {
        "http": get_asgi_application(),
        "websocket": AuthMiddlewareStack(URLRouter(websocket_urlPattern)),
    }
)

channel_routing = {"http.request": StaticFilesHandler()}

А DeviceCodeConsumer - это следующее:

class DeviceCodeConsumer(WebsocketConsumer):
    def connect(self):
        self.group_name = 'device_key'

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

        print(f"Added to group {self.group_name}")  # Debugging message

        # Accept the WebSocket connection
        self.accept()

    def receive(self, text_data):
        # Handle incoming JSON messages if needed
        print('RECIEVED: ' + text_data)
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        async_to_sync(self.channel_layer.group_send)(
            self.group_name,
            {
                'type': 'update_device_key',
                'message': message
            }
        )

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

        self.send(text_data=json.dumps({
            'type': 'update_device_key',
            'message': message
        }))

Таким образом, я создаю группу с именем device_key и хочу добавить сообщение в эту группу, когда в представлении django выполняется некоторый код, и уведомить об этом фронтенд. Представление в django, которое у меня есть, выглядит следующим образом:

@login_required
def device_edit_view(request, device_id):
    if device_id <= 0:
        device = Device()
    else:
        device = Device.objects.get(pk=device_id)

    if request.method == "POST":
        print("POST method reached")  # Debugging message to confirm POST method
        form = DeviceEditForm(data=request.POST, instance=device)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.save()
            device_id = instance.id
            messages.success(request, "Your device has been saved")

            # Notify the WebSocket group using the utility function
            notify_websocket_group(
                "device_key",  # Group name
                "update_device_key",  # Type of the message
                instance.key
            )
            return redirect("/devices")
    else:
        form = DeviceEditForm(instance=device)
    form.fields["playlist"].queryset = Playlist.objects.filter(
        company_id=request.session[COMPANY_ID]
    )
    context = {
        "form": form,
        "device": device,
    }

    return render(request, "play/device-edit.html", context)

Там, где у меня есть # Notify the WebSocket group using the utility function, я хочу добавить группу каналов, что есть изменение, и я также должен получить уведомление на фронтенде. notify_websocket_group выглядит следующим образом:

def notify_websocket_group(group_name, event_type, message): «"» Уведомляет группу WebSocket с заданным сообщением.

Args:
    group_name (str): The group to send the message to.
    event_type (str): The type of the message (for example, 'device_key').
    message (str): The message content.
"""

print(f"Notifying group: {group_name}, Event Type: {event_type}, Message: {message}")  # Debugging message

channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send(
    group_name,
    {
        "type": event_type,  # The method to call on the consumer
        "message": message,
    }
))

print('Sent WebSocket message to group device_key')  # Debugging message

Я вижу все эти печати в терминале, но это также должно вызвать recieve из DeviceCodeConsumer и я должен увидеть print('RECIEVED: ' + text_data). Но я этого не вижу.

Что я делаю не так?

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