在django中发送post_保存信号通知

在django中发送post_保存信号通知,django,django-channels,Django,Django Channels,我有一个名为deposit的模型,我试图在表中添加新行时发送实时通知。是否可以使用django通道执行此操作 您只需为post\u保存添加一个信号 @receiver(保存后,发送方=存款) def信号存储保存(发送方、实例、已创建、**kwargs): 如果创建:#这意味着它是一个新行 #使用django通道发送通知 您只需为后期保存添加一个信号 @receiver(保存后,发送方=存款) def信号存储保存(发送方、实例、已创建、**kwargs): 如果创建:#这意味着它是一个新行 #使用

我有一个名为
deposit
的模型,我试图在表中添加新行时发送实时通知。是否可以使用django通道执行此操作

您只需为
post\u保存添加一个信号

@receiver(保存后,发送方=存款)
def信号存储保存(发送方、实例、已创建、**kwargs):
如果创建:#这意味着它是一个新行
#使用django通道发送通知

您只需为
后期保存添加一个信号

@receiver(保存后,发送方=存款)
def信号存储保存(发送方、实例、已创建、**kwargs):
如果创建:#这意味着它是一个新行
#使用django通道发送通知

是的,这是我最近使用的方式。 您可以使用Django模型的save方法,如下所示:

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer


class Info(models.Model):
    [...] your model fields


    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        super(Info, self).save(force_insert, force_update, using, update_fields)
        # send info to channel
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            'infochannel',
            {
                'type': 'infochannel.message',
                'device_id': str(self.device_id)
            }
        )
在消费者方面:

from channels.generic.websocket import AsyncWebsocketConsumer


class DataConsumer(AsyncWebsocketConsumer):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.group_name = ''

    async def connect(self):
        # we are using one fixed group
        self.group_name = 'infochannel'

        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard('infochannel', self.channel_name)

    async def infochannel_message(self, event):
        # Send message to websocket group
        await self.send(text_data=event['device_id'])

其中,
device\u id
是我的模型上的一个字段,当然您还必须设置路由、redis\u频道等等。

是的,这是我最近使用的方式。 您可以使用Django模型的save方法,如下所示:

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer


class Info(models.Model):
    [...] your model fields


    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        super(Info, self).save(force_insert, force_update, using, update_fields)
        # send info to channel
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            'infochannel',
            {
                'type': 'infochannel.message',
                'device_id': str(self.device_id)
            }
        )
在消费者方面:

from channels.generic.websocket import AsyncWebsocketConsumer


class DataConsumer(AsyncWebsocketConsumer):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.group_name = ''

    async def connect(self):
        # we are using one fixed group
        self.group_name = 'infochannel'

        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard('infochannel', self.channel_name)

    async def infochannel_message(self, event):
        # Send message to websocket group
        await self.send(text_data=event['device_id'])

其中,
device\u id
是我的模型上的一个字段,当然您还必须设置路由、redis\u通道等。

这会重新加载视图吗?这本身不会,但当您使用django通道发送通知时,它应该重新加载视图吗?这本身不会,但当您使用django通道发送通知时,它应该重新加载视图