最近在学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 会报错。报错提示你不能新旧配置混用。

用命令查版本

img

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'])  # 可以根据实际需要添加模块

**总结****