gpt4 book ai didi

django - 不断地从服务器向客户端发送数据

转载 作者:行者123 更新时间:2023-12-04 15:06:31 24 4
gpt4 key购买 nike

看看这个example .
如您所见,某种 event不断地发送给客户端。我想用 Django-Channels 模仿这个, 里面 consumers.py .这是我所拥有的简化版本:

class ChatConsumer(AsyncConsumer):
async def ws_connect(self, event):
self.send = get_db_object()

....

await self.send({
"type": "websocket.accept"
})

# I need to CONSTANTLY receive & send data
async def ws_receive(self, event):

obj = ...# query DB and get the newest object

json_obj = {
'field_1': obj.field_1,
'field_2': obj.field_2,
}

await self.send({
"type": "websocket.send",
"text": json.dumps(json_obj)
})


@database_sync_to_async
def get_db_object(self, **kwargs):
return Some_Model.objects.get(**kwargs)[0]
在这里,我希望我的 Django 后端不断地:
  • 查询数据库
  • 从 DB
  • 接收 obj
  • 将接收到的 obj 作为 event 发送到前端 WebSocket

  • 我怎样才能做到这一点?重要的是我需要 不断向客户端发送数据。
    大部分 Django-Channels互联网上的资源仅涵盖聊天应用程序,它们不一定会不断向客户端发送数据。我找不到任何可以完成这项工作的工作代码。
    请不要再推荐 Redis 或 channel 文档...或一些缺乏良好文档的随机 3rd 方库...它很容易推荐但很难实现。比如我发现有人推荐 Snorky ,但它确实缺乏有关如何实现它的文档。
    但是,如果有专门做这项工作的网站,我可能会看一下,即使它不使用 Django-Channels。

    最佳答案

    consumers.py

    import asyncio
    from channels.consumer import AsyncConsumer

    class ChatConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
    self.connected = True
    print("connected", event)
    await self.send({
    "type": "websocket.accept"
    })

    while self.connected:
    await asyncio.sleep(2)

    obj = # do_something (Ex: constantly query DB...)

    await self.send({
    'type': 'websocket.send',
    'text': # obj,
    })

    async def websocket_receive(self, event):
    print("receive", event)

    async def websocket_disconnect(self, event):
    print("disconnected", event)
    self.connected = False
    Javascript
    var loc = window.location;
    var wsStart = 'ws://';
    if (loc.protocol == 'https:') {
    wsStart = 'wss://'
    }
    var endpoint = wsStart + loc.host + loc.pathname;

    var socket = new WebSocket(endpoint);

    socket.onmessage = function(e){
    console.log("message", e);
    };
    socket.onopen = function(e){
    console.log("open", e);
    };
    socket.onerror = function(e){
    console.log("error", e)
    };
    socket.onclose = function(e){
    console.log("close", e)
    };
    您只需修改 obj并发送它。您可以根据需要扩展此功能。所以,现在我有兴趣在我的 PostgreSQL 中获取最新插入的行并将该行注入(inject)我的 WebSocket。我可以每 2 秒查询一次我的数据库,因为它是由 await asyncio.sleep(2) 指定的。 , 并将其注入(inject)前端套接字。

    关于django - 不断地从服务器向客户端发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725863/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com