我试图熟悉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循环,但在重新启动循环后-消息会发送给所有用户。我如何使数据流在任何用户进入频道的任何时间都可用?
最佳答案
这工作:
class ChatConsumer(AsyncWebsocketConsumer):
vehicle_keeper = []
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = f'chat_{self.room_name}'
# Join room group
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
if not self.vehicle_keeper:
self.vehicle = connect('/dev/ttyACM0', wait_ready=True, rate=4)
self.vehicle_keeper.append(self.vehicle)
else:
self.vehicle = self.vehicle_keeper[0]
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'drone_position',
'message': "HELLO!"
}
)
async def drone_position(self, event):
while True:
await asyncio.sleep(1)
await self.send(text_data=json.dumps({
'message': {
'mess': event['message'],
'yaw': self.vehicle._yaw,
'pitch': self.vehicle._pitch,
'roll': self.vehicle._roll,
}
}))
密钥位于
vehicle_keeper
列表中,该列表将车辆连接保持在全局列表中,并且当新用户进入时-它使用现有连接而不自行建立连接。关于python - 带有Django channel 的恒定数据流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54480779/