将数据发送到 Django 通道
Sending data to Django channels
我有一个外部 Python 脚本,它每秒生成 JSON 数据;另一方面,我有一个 Django 应用程序。我想在我的 Django 应用程序的网页上流式传输该数据。我已经用 Django 通道构建了一个消费者,但我不知道如何让 Django 拥有我从其他 Python 脚本生成的数据。
这是我的基本消费者:
class EchoConsumer(AsyncConsumer):
async def websocket_connect(self, event):
print("connected", event)
await self.send({
"type": "websocket.accept"
})
async def websocket_receive(self, event):
print("received", event)
# Echo the same received payload
async def websocket_disconnect(self, event):
print("disconnected", event)
有具体的方法吗?或者我应该在中间使用其他服务吗?欢迎任何建议
您可以做的是使用@database_sync_to_async 装饰器将该数据注入数据库模型。看看下面的例子
async def websocket_receive(self, event):
message = await self.create_message_db(event.get('data'))
@database_sync_to_async
def create_message_db(self, data):
return Message.objects.create(thread=self.thread, sender=self.scope['user'],
body=data['message'])
您可以使用用于将两个或多个 'Consumers' 连接在一起的通道层。例如,您想构建一个聊天室应用程序,并希望一个房间中的多个用户在 'Realtime' 中相互发送消息,您必须 link 然后使用通道层。
async def start_chat(self, event):
auth_user = self.scope['user']
data = event['data']
recipient_user = data['recipient']
self.chat_room = f'thread_{self.thread.id}'
await self.channel_layer.group_add(
self.chat_room,
self.channel_name
)
async def send_chat_message(self, event):
message = await self.create_message_db(event.get('data'))
message_data = MessageReadOnlySerializer(message).data
# encoding the UUID object to json
uid = message_data['sender']
message_data['sender'] = json.loads(json.dumps(uid, cls=utlis.UUIDEncoder))
await self.channel_layer.group_send(
group=self.chat_room,
message={
'type': 'echo.message',
'data': {
'message': message_data
}
}
)
async def echo_message(self, event):
await self.send_json(event)
上面的代码是如何使用通道层的示例。在 start_chat 函数中,我们将两个消费者添加到 group 这样我们就在他们之间建立了一条通信路径,所以现在当消费者调用 send_chat_message它将在两个消费者上调用 echo_message 函数。
我有一个外部 Python 脚本,它每秒生成 JSON 数据;另一方面,我有一个 Django 应用程序。我想在我的 Django 应用程序的网页上流式传输该数据。我已经用 Django 通道构建了一个消费者,但我不知道如何让 Django 拥有我从其他 Python 脚本生成的数据。
这是我的基本消费者:
class EchoConsumer(AsyncConsumer):
async def websocket_connect(self, event):
print("connected", event)
await self.send({
"type": "websocket.accept"
})
async def websocket_receive(self, event):
print("received", event)
# Echo the same received payload
async def websocket_disconnect(self, event):
print("disconnected", event)
有具体的方法吗?或者我应该在中间使用其他服务吗?欢迎任何建议
您可以做的是使用@database_sync_to_async 装饰器将该数据注入数据库模型。看看下面的例子
async def websocket_receive(self, event):
message = await self.create_message_db(event.get('data'))
@database_sync_to_async
def create_message_db(self, data):
return Message.objects.create(thread=self.thread, sender=self.scope['user'],
body=data['message'])
您可以使用用于将两个或多个 'Consumers' 连接在一起的通道层。例如,您想构建一个聊天室应用程序,并希望一个房间中的多个用户在 'Realtime' 中相互发送消息,您必须 link 然后使用通道层。
async def start_chat(self, event):
auth_user = self.scope['user']
data = event['data']
recipient_user = data['recipient']
self.chat_room = f'thread_{self.thread.id}'
await self.channel_layer.group_add(
self.chat_room,
self.channel_name
)
async def send_chat_message(self, event):
message = await self.create_message_db(event.get('data'))
message_data = MessageReadOnlySerializer(message).data
# encoding the UUID object to json
uid = message_data['sender']
message_data['sender'] = json.loads(json.dumps(uid, cls=utlis.UUIDEncoder))
await self.channel_layer.group_send(
group=self.chat_room,
message={
'type': 'echo.message',
'data': {
'message': message_data
}
}
)
async def echo_message(self, event):
await self.send_json(event)
上面的代码是如何使用通道层的示例。在 start_chat 函数中,我们将两个消费者添加到 group 这样我们就在他们之间建立了一条通信路径,所以现在当消费者调用 send_chat_message它将在两个消费者上调用 echo_message 函数。