Using django signals in channels consumer classes

前端 未结 3 1503
礼貌的吻别
礼貌的吻别 2021-01-31 11:16

I am trying to develop an auction type system, where a customer makes an order, and then different stores can offer a price for that order.

An interesting part of this

3条回答
  •  忘了有多久
    2021-01-31 11:52

    If someone stumbles upon on that, this is the way I solved it in the signals.py. I have a Job and need to send its status to the client every time it changes. This is my signals.py:

    import channels.layers
    from asgiref.sync import async_to_sync
    
    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    from .models import Job
    
    
    def send_message(event):
        '''
        Call back function to send message to the browser
        '''
        message = event['text']
        channel_layer = channels.layers.get_channel_layer()
        # Send message to WebSocket
        async_to_sync(channel_layer.send)(text_data=json.dumps(
            message
        ))
    
    
    @receiver(post_save, sender=Job, dispatch_uid='update_job_status_listeners')
    def update_job_status_listeners(sender, instance, **kwargs):
        '''
        Sends job status to the browser when a Job is modified
        '''
    
        user = instance.owner
        group_name = 'job-user-{}'.format(user.username)
    
        message = {
            'job_id': instance.id,
            'title': instance.title,
            'status': instance.status,
            'modified': instance.modified.isoformat(),
        }
    
        channel_layer = channels.layers.get_channel_layer()
    
        async_to_sync(channel_layer.group_send)(
            group_name,
            {
                'type': 'send_message',
                'text': message
            }
        )
    

    By the way, I have a Consumer class JobUserConsumer(AsyncWebsocketConsumer) where I define the groups:

    async def connect(self):
    
        user = self.scope["user"]
        self.group_name = 'job-user-{}'.format(user.username)
    
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
    
        await self.accept()
    

    The project I used this is here: https://github.com/ornl-ndav/django-remote-submission/tree/master/django_remote_submission

提交回复
热议问题