Django channels group_send无法正常工作

qmb5sa22  于 2023-03-31  发布在  Go
关注(0)|答案(3)|浏览(125)

我试图用django-channels实现一个竞价模块。基本上我会广播我从客户端收到的任何消息,我的消费者部分如以下代码片段所示:

class BidderConsumer(AsyncJsonWebsocketConsumer):

    async def connect(self):
        print("Connected")
        await self.accept()
        # Add to group
        self.channel_layer.group_add("bidding", self.channel_name)
        # Add channel to group
        await self.send_json({"msg_type": "connected"})

    async def receive_json(self, content, **kwargs):
        price = int(content.get("price"))
        item_id = int(content.get("item_id"))
        print("receive price ", price)
        print("receive item_id ", item_id)
        if not price or not item_id:
            await self.send_json({"error": "invalid argument"})

        item = await get_item(item_id)
        # Update bidding price
        if price > item.price:
            item.price = price
            await save_item(item)
            # Broadcast new bidding price
            print("performing group send")
            await self.channel_layer.group_send(
                "bidding",
                {
                    "type": "update.price"
                    "price": price,
                    "item_id": item_id
                }
            )

    async def update_price(self, event):
        print("sending new price")
        await self.send_json({
            "msg_type": "update",
            "item_id": event["item_id"],
            "price": event["price"],
        })

但是当我尝试从浏览器更新价格时,消费者可以收到来自浏览器的消息,但无法成功调用update_price函数。(sending new price从未打印):

receive price  701
receive item_id  2
performing group send

我只是遵循这个例子:https://github.com/andrewgodwin/channels-examples/tree/master/multichat
任何建议将不胜感激!

rqqzpn5f

rqqzpn5f1#

基本上,从这个改变:

await self.channel_layer.group_send(
    "bidding",
    {
        "type": "update.price"
         "price": price,
         "item_id": item_id
    }
)

改为:

await self.channel_layer.group_send(
     "bidding",
     {
         "type": "update_price"
         "price": price,
         "item_id": item_id
     }
)

注意type键中的下划线。您的函数名为update_price,因此类型需要相同。

3df52oht

3df52oht2#

这可能会帮助您:
在www.example.com中routing.py尝试path("", MainConsumer.as_asgi())而不是path("", MainConsumer)

of1yzvn4

of1yzvn43#

我遇到了同样的问题。你可以尝试为channels_layer分配一个单独的redis数据库。这是通过在其端口+ '/{number_of_database}'后添加redis数据库编号来完成的
好像是那个'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/1'
默认情况下,Redis示例有16个数据库(编号为0到15),但这可以在Redis配置文件中进行配置。每个数据库都是一个单独的命名空间,可以保存自己的一组键和值。
请注意,在生产环境中使用Redis数据库时,最好将不同类型的数据分隔到单独的数据库中,甚至分隔Redis示例,以避免冲突并提高性能。
在www.example.com中settings.py

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": ['redis://' + REDIS_HOST + ':' + REDIS_PORT + '/1'],
        },
    },
}

相关问题