我在写此问题时找到了解决方案,并认为其他人也可以使用它!由于这里的大多数问题都与2.0或更高版本之前的频道版本有关,因此这就是您应该如何处理使用者中的group_send事件。
问题不仅在于我如何使用该
group_send函数,还错误地认为将groups类变量添加到EventConsumer应该自动将其添加到该/那些组中,而事实并非如此!您必须在
connect类函数中手动添加组,并在函数中删除组
disconnect!
然后,问题还在于我的使用者没有指定适当的事件处理程序。在接收警报请求的视图文件中,我已将“类型”设置为“测试”。测试未反映在我的EventConsumer类中,因此无法处理该事件。正如multichat例子说明这里的行号146,辅助函数得到取决于事件,将会发出的类型调用。因此,事件类型“
event.alarm”
event_alarm在您的使用者中应该具有相应的功能!很简单,但是记录的不是很好:)。最终的解决方案如下所示:
在中
consumers.py,请注意
group_addin连接和
group_discardin断开!
class EventConsumer(JsonWebsocketConsumer): def connect(self): async_to_sync(self.channel_layer.group_add)( 'events', self.channel_name ) self.accept() def disconnect(self, close_pre): print("Closed websocket with pre: ", close_pre) 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'] } )因此,
events_alarm从以下函数调用上述函数
group_send:
from django.shortcuts import HttpResponsefrom channels.layers import get_channel_layerfrom asgiref.sync import async_to_syncdef alarm(req): layer = get_channel_layer() async_to_sync(layer.group_send)('events', { 'type': 'events.alarm', 'content': 'triggered' }) return HttpResponse('<p>Done</p>')如果您需要进一步澄清问题/答案,请告诉我!干杯!



