Při psaní těchto otázek jsem našel řešení a myslel jsem, že by ho mohl využít i někdo jiný! Protože většina zde uvedených otázek se týká kanálů verze před 2.0 a vyšší, takto byste měli zacházet s událostmi group_send u vašich spotřebitelů.
Problém nespočíval pouze v tom, jak jsem použil group_send
i když jsem chybně předpokládal, že přidání proměnné třídy skupin do mého EventConsumer by ji mělo automaticky přidat do této/těch skupin, to NE! Skupiny musíte přidat ručně v connect
class a odstranit skupiny v disconnect
funkce!
Problém pak také spočíval v tom, že můj spotřebitel neměl specifikované správné obslužné rutiny událostí. V mém souboru zobrazení, kde je přijat požadavek na alarm, jsem nastavil „typ“ na „test“. Test se neodrazil v mé třídě EventConsumer, takže událost nemohla být zpracována. Jak je uvedeno v příkladu multichatu zde na lince číslo 146, pomocné funkce jsou volány v závislosti na typu odeslané události. Typ události 'event.alarm' by tedy měl mít odpovídající funkci event_alarm
ve vašem spotřebiteli! Jednoduché, ale ne tak dobře zdokumentované :). Takto vypadalo konečné řešení:
V consumers.py
, poznamenejte si group_add
v connect a group_discard
v odpojení!
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že výše uvedená funkce events_alarm
je voláno z následujícího 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>')
Pokud potřebujete další vysvětlení k otázce/odpovědi, dejte mi prosím vědět! Na zdraví!