无需打开journey页面实现Django项目WebSocket消息流转方案咨询
解决方案:将消息处理与转发逻辑移至Django后端WebSocket消费者
核心思路
把原本在journey.html前端页面中处理trigger_journey消息、判断审批需求并转发manager_approval消息的逻辑,迁移到Django的WebSocket后端消费者中,彻底摆脱对前端页面的依赖。
具体实现步骤
1. 重构WebSocket消费者
修改项目中的consumers.py,添加对trigger_journey类型消息的后端处理逻辑:
# consumers.py from channels.generic.websocket import AsyncWebsocketConsumer import json class JourneyConsumer(AsyncWebsocketConsumer): async def connect(self): # 将当前连接加入经理消息组 await self.channel_layer.group_add( "manager_approval_group", self.channel_name ) await self.accept() async def disconnect(self, close_code): await self.channel_layer.group_discard( "manager_approval_group", self.channel_name ) async def receive(self, text_data): text_data_json = json.loads(text_data) message_type = text_data_json.get('type') if message_type == 'trigger_journey': # 执行原本在journey.html中的审批判断逻辑 need_approval = self.judge_approval_requirement(text_data_json) if need_approval: # 向后端组发送审批消息,自动推送给所有连接的manager页面 await self.channel_layer.group_send( "manager_approval_group", { 'type': 'forward_approval_msg', 'payload': text_data_json['payload'] } ) def judge_approval_requirement(self, msg_data): # 替换为你的实际业务判断逻辑 # 比如根据消息中的参数判断是否需要经理审批 return msg_data['payload'].get('need_manager_approval', False) async def forward_approval_msg(self, event): # 将审批消息发送给连接的manager_dashboard页面 await self.send(text_data=json.dumps({ 'type': 'manager_approval', 'payload': event['payload'] }))
2. 配置WebSocket路由
在routing.py中确保路由指向上述消费者:
# routing.py from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/journey_flow/', consumers.JourneyConsumer.as_asgi()), ]
3. 调整前端代码
chat.html:保持发送trigger_journey消息的逻辑,直接发送到后端WebSocket地址
// chat.html中的WebSocket发送逻辑 const chatSocket = new WebSocket( 'ws://' + window.location.host + '/ws/journey_flow/' ); // 触发流程消息示例 chatSocket.send(JSON.stringify({ 'type': 'trigger_journey', 'payload': { 'content': '需要触发的流程内容', 'need_manager_approval': true } }));
manager_dashboard.html:保持接收manager_approval消息的逻辑,连接到同一个后端WebSocket地址
// manager_dashboard.html中的WebSocket接收逻辑 const managerSocket = new WebSocket( 'ws://' + window.location.host + '/ws/journey_flow/' ); managerSocket.onmessage = function(e) { const data = JSON.parse(e.data); if (data.type === 'manager_approval') { // 处理审批消息的业务逻辑 console.log('收到审批请求:', data.payload); } };
journey.html:若无需再通过该页面处理消息,可移除相关WebSocket转发逻辑;若仍需展示流程状态,保留连接但不再处理消息转发
关键说明
- 利用Channels的
channel_layer组通信能力,后端可直接将消息推送给所有订阅目标组的前端页面,无需依赖中间页面转发 - 业务判断逻辑完全在后端执行,即使
journey.html关闭,chat.html发送的消息依然会被后端处理并转发给manager_dashboard.html - 可根据实际需求扩展组的划分(比如按用户ID创建专属组),确保消息精准推送给对应经理
内容的提问来源于stack exchange,提问作者GAYATHRI K
相关产品推荐
相关产品推荐

