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

无前端DRF项目集成Django Channels推送下载进度无响应问题咨询

问题根因

  1. 消费者未加入指定的频道组:你调用group_send往download_state组推送消息,但客户端建立WebSocket连接后,没有被加入该组,自然收不到组内消息。
  2. 缺少组消息对应的处理方法:group_send中指定的type为send.percent,Channels会自动将其转换为蛇形命名的方法send_percent,你的消费者中没有定义该方法,无法将消息转发给客户端。
  3. 导入错误:你的消费者类继承了AsyncJsonWebsocketConsumer,但导入的是AsyncWebsocketConsumer,会导致运行报错。

修改步骤

1. 修正consumers.py

# 修正导入,引入AsyncJsonWebsocketConsumer
from channels.generic.websocket import AsyncJsonWebsocketConsumer

class DownloadStateConsumer(AsyncJsonWebsocketConsumer):
    # 组名统一用常量,避免拼写错误
    GROUP_NAME = "download_state"

    async def connect(self):
        # 连接建立后加入进度推送组
        await self.channel_layer.group_add(
            self.GROUP_NAME,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        # 连接断开后移出组
        await self.channel_layer.group_discard(
            self.GROUP_NAME,
            self.channel_name
        )

    # 对应group_send的type: send.percent的处理方法
    async def send_percent(self, event):
        # 直接把进度推送给客户端
        await self.send_json({
            "message": event["message"]
        })

2. 检查file_download.py的依赖导入

确保文件开头已导入所需工具:

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer

3. 验证Channel Layer配置

确保你已安装依赖:pip install channels-rabbitmq,且本地RabbitMQ服务正常运行,若你的RabbitMQ有自定义账号密码、端口,需要补充CHANNEL_LAYERS配置:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_rabbitmq.core.RabbitmqChannelLayer",
        "CONFIG": {
            "host": "amqp://用户名:密码@127.0.0.1:5672/%2F",
        },
    },
}

额外说明

以上修改完成后重启服务即可,原有客户端代码无需调整,就能正常接收下载进度推送。如果你的项目需要区分不同下载任务的进度,不要用全局的download_state组,可以在WebSocket连接时传入任务ID,按任务ID建组,download_file方法推送时指定对应任务的组即可实现多任务进度隔离。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:15:08