Как правильно настроить каналы и сокеты в 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). Но я этого не вижу.
Что я делаю не так?