使用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
相关产品推荐
相关产品推荐

