Podczas pisania tych pytań znalazłem rozwiązanie i pomyślałem, że ktoś inny też może z niego skorzystać! Ponieważ większość pytań tutaj dotyczy wersji kanałów przed 2.0 i nowszymi, w ten sposób powinieneś obsługiwać zdarzenia group_send w swoich klientach.
Problem nie polegał tylko na tym, jak użyłem group_send
jednak błędnie założyłem, że dodanie zmiennej klasy groups do mojego EventConsumer powinno automatycznie dodać ją do tej/tych grup, NIE! Musisz dodać grupy ręcznie w connect
funkcja klasy i usuwanie grup w disconnect
funkcja!
Problem polegał również na tym, że mój konsument nie miał określonych odpowiednich programów obsługi zdarzeń. W moim pliku widoku, w którym pobierane jest żądanie alarmu, ustawiłem „typ” na „test”. Test nie został odzwierciedlony w mojej klasie EventConsumer, więc zdarzenie nie mogło zostać przetworzone. Jak zauważono w przykładzie multiczatu w wierszu nr 146, funkcje pomocnicze są wywoływane w zależności od typu wysłanego zdarzenia. Zatem typ zdarzenia „event.alarm” powinien mieć odpowiednią funkcję event_alarm
w Twoim konsumencie! Proste, ale nie tak dobrze udokumentowane :). Oto jak wyglądało ostateczne rozwiązanie:
W consumers.py
, zwróć uwagę na group_add
w connect i group_discard
w rozłączeniu!
class EventConsumer(JsonWebsocketConsumer):
def connect(self):
async_to_sync(self.channel_layer.group_add)(
'events',
self.channel_name
)
self.accept()
def disconnect(self, close_code):
print("Closed websocket with code: ", close_code)
async_to_sync(self.channel_layer.group_discard)(
'events',
self.channel_name
)
self.close()
def receive_json(self, content, **kwargs):
print("Received event: {}".format(content))
self.send_json(content)
# ------------------------------------------------------------------------------------------------------------------
# Handler definitions! handlers will accept their corresponding message types. A message with type event.alarm
# has to have a function event_alarm
# ------------------------------------------------------------------------------------------------------------------
def events_alarm(self, event):
self.send_json(
{
'type': 'events.alarm',
'content': event['content']
}
)
Tak więc powyższa funkcja events_alarm
jest wywoływany z następującego group_send
:
from django.shortcuts import HttpResponse
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
def alarm(req):
layer = get_channel_layer()
async_to_sync(layer.group_send)('events', {
'type': 'events.alarm',
'content': 'triggered'
})
return HttpResponse('<p>Done</p>')
Daj mi znać, jeśli potrzebujesz więcej wyjaśnień do pytania/odpowiedzi! Pozdrawiam!