You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:45:35