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

使用Redis时Django Celery task.delay()返回kombu错误并挂起

解决Django视图调用Celery任务出现Connection Refused的问题

问题分析

核心矛盾:Celery任务在python manage.py shell中能正常执行,但在Django视图调用send_support_message.delay()时抛出kombu.exceptions.OperationalError: [Errno 111] Connection refused。这说明Celery客户端在视图环境下的配置与shell环境不一致,或Redis连接地址存在解析问题。

解决方案

1. 统一Celery配置加载逻辑,消除重复定义

你的Celery配置存在重复设置Broker地址的问题,且加载顺序可能导致配置被覆盖。修改celery.py如下,让Celery完全从Django Settings读取配置:

import os
from celery import Celery

# 设置默认的Django配置模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Gimsap.settings')

# 初始化Celery实例
app = Celery('Gimsap', namespace='CELERY')

# 直接从Django Settings加载所有Celery配置
app.config_from_object('django.conf:settings')

# 自动发现所有已注册APP中的tasks.py
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

2. 在Django Settings中明确配置Redis地址

在Gimsap/settings.py中添加或修正Celery的Broker配置,用127.0.0.1替代localhost(避免DNS解析异常):

# Celery配置
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'  # 若需要存储任务结果则添加

3. 重启服务确保配置生效

执行以下命令重启Celery Worker和Django开发服务器:

# 重启Celery Worker
celery -A Gimsap worker -l info

# 重启Django服务
python manage.py runserver

4. 额外排查点

  • 验证Redis服务监听地址:执行redis-cli -h 127.0.0.1 -p 6379 ping,返回PONG说明Redis正常监听该地址。
  • 检查视图中的任务导入:确保视图中正确导入任务,例如from your_app.tasks import send_support_message,避免导入错误的任务实例。
  • 生产环境排查:若使用uWSGI/Gunicorn等部署,确认进程有权限访问Redis端口,且无防火墙/网络隔离规则限制连接。

原因说明

shell环境下任务能正常执行,是因为你手动设置的BROKER_URL直接生效;而Django视图环境中,app.config_from_object('django.conf:settings')会优先读取Settings中的配置,若Settings中的CELERY_BROKER_URL不正确(比如用了localhost导致解析失败),就会出现连接拒绝错误。统一配置后,视图和shell环境使用相同的Broker地址,即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:18:19