首次启动Celery对接Redis报错:AttributeError: 'NoneType'无'Redis'属性
问题根因
该AttributeError报错核心是Redis Python客户端(redis-py)版本与当前Celery/Kombu版本不兼容:高版本redis-py(≥4.0)调整了内部导入结构,低于5.3版本的Kombu无法识别对应Redis类,加载时出现redis对象为None、找不到Redis属性的异常。除此之外配置代码中存在的逻辑错误也会影响启动。
修复步骤
调整依赖版本
先卸载现有不兼容的依赖包,安装经过验证的稳定兼容组合:pip uninstall redis kombu celery # 适配Django场景的稳定版本组合 pip install celery==5.2.7 kombu==5.2.4 redis==3.5.3若需要使用高版本redis-py,直接将Celery和Kombu都升级到最新稳定版即可。
修复celery.py配置错误
现有配置缺os模块导入、存在缩进错误,且未指定配置命名空间,修正后代码如下:import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_test.settings') app = Celery('celery_test') # 指定配置命名空间,避免和Django其他配置冲突 app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): print(f'Request: {self.request!r}')修正settings.py配置
匹配Celery命名空间要求调整配置项,同时指定Redis数据库编号避免业务冲突:#celery配置 CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'Asia/Kolkata'修正tasks.py重复初始化问题
项目根目录已经初始化了全局Celery实例,不需要在任务文件中重复创建,改用shared_task装饰器注册任务即可:from celery import shared_task @shared_task def add(x, y): return x + y
验证方法
修改完成后执行以下命令启动Celery worker,无报错即为修复完成:
celery -A celery_test worker --loglevel=info
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

