Using django signals in channels consumer classes

前端 未结 3 1506
礼貌的吻别
礼貌的吻别 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

    For those who still have problems with web sockets, this could be helpful:

    from api.models import Order, OrderOffer
    from asgiref.sync import async_to_sync
    import channels.layers
    from channels.generic.websocket import JsonWebsocketConsumer
    from django.db.models import signals
    from django.dispatch import receiver
    
    
    class OrderOfferConsumer(JsonWebsocketConsumer):
        def connect(self):
            async_to_sync(self.channel_layer.group_add)(
                'order_offer_group',
                self.channel_name
            )
            self.accept()
    
        def disconnect(self, close_code):
            async_to_sync(self.channel_layer.group_discard)(
                'order_offer_group',
                self.channel_name
            )
            self.close()
    
        def receive_json(self, content, **kwargs):
            print(f"Received event: {content}")
    
        def events_alarm(self, event):
            self.send_json(event['data'])
    
        @staticmethod
        @receiver(signals.post_save, sender=OrderOffer)
        def order_offer_observer(sender, instance, **kwargs):
            layer = channels.layers.get_channel_layer()
            async_to_sync(layer.group_send)('order_offer_group', {
                'type': 'events.alarm',
                'data': {
                    'text': 'Offer received',
                    'id': instance.pk
                }
            })
    

    In urls.py you need to register a new webscoket route:

    websocket_urlpatterns = [url(r'^order_offer$', OrderOfferConsumer)]
    

提交回复
热议问题