【发布时间】:2019-06-26 02:33:01
【问题描述】:
我正在尝试熟悉Django channels 和web-sockets。
我有一个任务 - 不断地将数据流式传输给连接到该频道的任何人。
目前,这是官方教程中的一段代码,有一些改进。
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = f'chat_{self.room_name}'
if not hasattr(self, 'vehicle'):
# this produses constant data stream
self.vehicle = connect('/dev/ttyACM0', wait_ready=True, rate=4)
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
# this part does not work!
await self.send(text_data=json.dumps({
'message': {
'mess': "Hi",
'yaw': self.vehicle._yaw,
'pitch': self.vehicle._pitch,
'roll': self.vehicle._roll,
}
}))
async def disconnect(self, close_code):
# Leave room group
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
但现在这段代码断开连接,前面没有显示任何内容。我找到了this answer,但那个循环也不起作用。
如果我将该 while 循环移动到单独的方法并从 receive 方法调用它(为了简短起见,我现在不会在这里展示) - 它可以工作,但是当新用户进入频道时,他不会'看不到来自 while 循环的消息。但是在重新启动循环后,消息会发送给所有用户。
如何让所有用户在任何时候进入频道时都可以使用数据流?
【问题讨论】:
-
我在您的代码中没有看到任何常量元素
-
@Ken4scholars 我的意思是我想流式传输每秒更改 4 次的数据(我从哪里得到它的评论)。所以我想将数据发送到前端可能是每秒 1 次。
-
你能发布执行恒定流的连接方法吗?
-
@Ken4scholars 这不是必需的 - 这是 DroneKit 库中的主要方法,实际上该路径是连接 Pixhawk 的 USB 端口,它会产生一些数据(例如关于其位置) 4 个刻度一秒。该方法工作正常。
-
很有必要。它究竟是如何产生数据并持续运行的?它显然不是生成器,因为您没有在消费者的循环中使用数据。因此,如果它有一个持续运行的 while 循环,则意味着它永远不会将任何内容返回给调用它的连接方法。这意味着
self.vehicle = connect('/dev/ttyACM0', wait_ready=True, rate=4)下的所有内容都不会运行
标签: python django websocket django-channels