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

Django后端执行耗时任务时,如何向前端发送实时进度更新?

实时进度推送方案调研:Django → Next.js

核心疑问解答

你的判断没错:后端向前端推送实时进度(比如循环任务的1/10、2/10)属于实时单向/双向通信场景,Socket类技术是主流实现方向之一,但HTTP范围内也有轻量方案(比如流式响应/Server-Sent Events),并非必须依赖Socket。


可行方案详解

1. WebSocket方案(适合双向交互场景)

如果后续需要前端给后端发指令(比如暂停/终止计算),WebSocket是更灵活的选择。Django生态里用channels库实现WebSocket:

  • 后端配置:
    1. 安装channels和channels-redis(本地测试也可以用InMemoryChannelLayer)
    2. 把Django的ASGI配置改成Channels的ASGI应用,创建WebSocket消费者(Consumer),定义进度推送的消息格式
    3. 计算任务执行时,通过channel_layer.group_send向指定前端连接推送进度数据(比如每完成一个循环就发一次)
  • 前端实现:Next.js里直接用原生WebSocket API,或者封装简单的钩子监听消息,更新进度UI

2. Server-Sent Events(SSE,HTTP流式响应,适合单向推送)

如果只是后端推进度给前端,不需要反向通信,SSE是更轻量的选择——它基于HTTP协议,不需要额外的Socket连接:

  • 后端配置:
    1. Django写一个视图,返回StreamingHttpResponse,设置Content-Type: text/event-stream
    2. 计算任务执行过程中,循环yield符合SSE格式的进度数据(比如data: {"progress": 20}\n\n)
  • 前端实现:Next.js里用原生EventSource API,监听message事件接收进度,更新UI

方案选型建议

  • 若仅需进度推送:优先选SSE,代码量少、无需额外依赖(除了Django原生),本地服务器部署无额外配置成本
  • 若需要双向交互(比如前端控制任务):选WebSocket+Channels方案,扩展性更强

内容的提问来源于stack exchange,提问作者jjgm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:35:00