最近在学celery,方便查找,以后再遇到其他celery问题直接放这篇文里
如需转载,标记出处
目录
[1.celery.exceptions.ImproperlyConfigured:Cannot mix new and old setting keys](#1.celery.exceptions.ImproperlyConfigured:Cannot mix new and old setting keys)
[ 背景:](# 背景:)
[ 解决办法:](# 解决办法:)
[2.ModuleNotFoundError: No module named ‘c‘](#2.ModuleNotFoundError: No module named ‘c‘)
[ 改正后完整示例](# 改正后完整示例)
1.celery.exceptions.ImproperlyConfigured:Cannot mix new and old setting keys
**背景:****
celery.exceptions.ImproperlyConfigured:
Cannot mix new and old setting keys, please rename the
following settings to the new format:
CELERY_TIMEZONE -> timezone
**原因:****
1.Celery 版本问题:
Celery 4.x 和 5.x 以后,不再支持老的 CELERY_ 开头的配置项(除了一部分)。如果项目里使用了 CELERY_ 开头的老配置方式,Celery 会报错。报错提示你不能新旧配置混用。
用命令查版本

2.settings.py 文件问题:
celery官方文档给出代码是全部大写并以 CELERY_开头,他在celery.py文件中加上了app.config_from_object(‘django.conf:settings’, namespace=‘CELERY’)
大写命名空间意味着所有Celery 配置选项必须以大写而不是小写形式指定
3.新旧混用:(比如我)
一部分配置用了老写法 CELERY_TIMEZONE,可能又加了一些新版本支持的配置,导致 Celery 无法解析
解决办法:
说实话,将报错英文翻译一下,报错是直接告诉哪里发生问题已经解决办法 settings.py 配置中,Celery 的配置方式 新旧版本混用,导致 Celery 启动时无法解析配置。 比如我用了:
broker_url = 'redis://127.0.0.1:6379/15'
# 设置时区
CELERY_TIMEZONE = "Asia/Shanghai"
# 任务超时时间(例如 30 分钟)
CELERY_TASK_TIME_LIMIT = 30 * 60
# 任务追踪开始
CELERY_TASK_TRACK_STARTED = True
但在 Celery 4.x/5.x 版本以后,这种 CELERY_ 前缀的配置方式已经废弃,时区的必须使用新版格式:
broker_url = 'redis://127.0.0.1:6379/15'
# 设置时区
timezone= "Asia/Shanghai"
# 任务超时时间(例如 30 分钟)
task_time_limit = 30 * 60
# 任务追踪开始
task_track_started=True
不过celery的文档里还是全部用的大写前缀开头
2.ModuleNotFoundError: No module named ‘c‘
背景:
Django里使用celery,刚学不久,格式错误
原因:
app.autodiscover_tasks(‘celery_tasks.sms’) **⚠️ 错误写法****
这个写法传进去的不是 list,而是 字符串,所以 Celery 会把 ‘celery_task.sms’ 拆成字符 [‘c’, ’e’, ’l’, ’e’, ‘r’, ‘y’, ‘_’, ’t’, ‘a’, ’s’, ‘k’, ‘.’, ’s’, ’m’, ’s’],然后逐个去 import,每个都尝试导入,最终 import c 报错
ModuleNotFoundError: No module named ‘c’
**解决办法****
必须使用 列表 (list) 形式传递:
app.autodiscover_tasks([‘celery_tasks.sms’])
如果有多个任务模块,例如 sms 和 email,应该这样写:
app.autodiscover_tasks([‘celery_tasks.sms’, ‘celery_tasks.email’])
**改正后完整示例****
import os
from celery import Celery
# 设置 Django 默认配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo_mall.settings')
# 创建 Celery 实例
app = Celery('celery_tasks')
# 加载配置
app.config_from_object('celery_tasks.config')
# 自动发现任务,注意是列表
app.autodiscover_tasks(['celery_tasks.sms', 'celery_tasks.email']) # 可以根据实际需要添加模块
**总结****
- autodiscover_tasks 参数必须是列表 list;
- 列表中的字符串是 模块路径,如 ‘celery_tasks.sms’;
- 否则会拆成单字符,导致 ModuleNotFoundError: No module named ‘c’;