You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需打开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:02:45