看看这个example。
正如你所看到的,某种event
不断地被发送到客户端。我想在consumers.py
中使用Django-Channels
来模拟这种情况。下面是我所拥有的简化版本:
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后端不断:
1.查询数据库
1.从数据库接收对象
1.将接收到的obj发送到前端WebSocket,格式为event
我如何才能做到这一点?重要的是我需要不断向客户端发送数据。
互联网上的大多数Django-Channels
资源只涉及聊天应用程序,这些应用程序不一定会不断地向客户端发送数据。我找不到任何可以完成这项工作的代码。
请不要再推荐Redis或渠道文档...或者一些随机的缺乏好的文档的第三方库...推荐很容易,但很难实现。例如,我发现有人推荐Snorky
,但它确实缺乏如何实现它的文档。
然而,如果有专门做这项工作的网站,我可能会去看看,即使它不使用Django-Channels。
3条答案
按热度按时间monwx1rj1#
consumers.py
Javascript
个你所需要做的就是修改
obj
并发送它。你可以根据需要扩展这个函数。所以,现在我感兴趣的是在我的PostgreSQL中获取最新插入的行,并将该行注入到我的WebSocket中。我可以每2秒查询一次我的数据库,因为它是由await asyncio.sleep(2)
指定的,并将它注入到前端套接字中。lmvvr0a82#
使用channels==1.* 和Django==1.*,你可以使用线程模块,例如:
bmp9r5qi3#
有点晚了党在这里,但当涉及到Django你应该总是尝试做的事情“他们的方式”第一...
因此,我只是使用Django Channels来完成这个任务。我的客户端向服务器发送一条消息,服务器随后用所需的数据库信息来响应,如下所示:
现在,至于触发常量事件的JS......我只是使用SetInterval每隔.25s向消费者请求更新!
我的逻辑是,它是客户端,所以如果它做了一点额外的工作没什么大不了的,因为服务器无论如何都会响应。JS看起来如下...
是的,你可以做更多的事情来使它更异步友好和优化。但是,你要求简单和工作,所以我希望这能有所帮助!