从Django信号接收器调用Channels AsyncWebsocketConsumer函数无效
Django Channels信号无法触发消费者目标函数
- 已多次排查调试,信号接收器内代码执行正常,但消费者的
new_ticket函数始终未被调用,网页无更新。 - 将
group_send代码移到消费者的connect函数中(替换async_to_sync为await),new_ticket可正常触发。 - 使用
InMemoryChannelLayer,语法已确认无误,查阅大量示例仍未解决问题。
相关代码
signals.py
# signals.py @receiver(post_save, sender=Ticket) def new_ticket(sender, instance, created, **kwargs): print("in receiver") if created: print("in created") channel_layer = get_channel_layer() print(channel_layer) async_to_sync(channel_layer.group_send( 'tickets_updates_group', { 'type': 'new_ticket', 'subject': "from receiver" })) print("after async_to_sync")
信号接收器中所有打印语句均正常执行。
consumers.py
# consumers.py class Tickets(AsyncWebsocketConsumer): async def connect(self): await self.channel_layer.group_add('tickets_updates_group', self.channel_name) await self.accept() async def disconnect(self, close_code): await self.channel_layer.group_discard('tickets_updates_group', self.channel_name) await self.close() async def new_ticket(self, event): print('in consumer.new_ticket') subject = event['subject'] print("subject: " + subject) await self.send(text_data=json.dumps({ 'subject': subject })) print("after send")
settings.py
# settings.py CHANNEL_LAYERS = { "default": { "BACKEND": "channels.layers.InMemoryChannelLayer" } }
内容的提问来源于stack exchange,提问作者Filip Kowalczyk
相关产品推荐
相关产品推荐

