Django集成Celery运行异步任务报Received unregistered task错误如何解决
问题根因
第一个报错(任务未注册)的原因
你启动Celery时直接指定tasks2作为App入口,此时Celery识别到的my_multiply任务名为无前缀的my_multiply;但Django运行时调用该任务,Celery会自动为任务拼接完整模块路径,生成的任务名为app_scrape.tasks2.my_multiply,二者名称不匹配导致KeyError。
第二个报错(相对导入失败)的原因
你将任务移入views.py后,直接在app_scrape目录下启动Celery,此时Python将当前目录识别为顶级模块目录,无法识别app_scrape作为父包,因此views中使用的相对导入.from forms会触发报错,同时启动过程也没有加载Django运行环境,本身也无法正常引入Django相关依赖。
修复步骤
- 整合Celery到Django项目配置
在proj_estategy/__init__.py中添加Celery全局配置:
import os from celery import Celery # 加载Django配置环境 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj_estategy.settings') app = Celery('proj_estategy') # 从Django settings读取Celery配置,配置项前缀统一为CELERY_ app.config_from_object('django.conf:settings', namespace='CELERY') # 自动扫描所有已注册Django应用下的任务 app.autodiscover_tasks()
- 在Django settings中添加Celery连接配置
在proj_estategy/settings.py末尾添加如下配置:
CELERY_BROKER_URL = 'amqps://mcbojxac:6sC7n38IdqmNoNgUjmjBkHum6RxRnaqt@clam.rmq.cloudamqp.com/mcbojxac' CELERY_RESULT_BACKEND = 'db+postgresql://kbsrjinigbkzqu:ed0aab74c997b56aa756d510439e28404cf1e87de629a7af66bd49ae29961bbb@ec2-44-195-201-3.compute-1.amazonaws.com/d85tdjbd3am2sc'
- 重构tasks2.py代码
删除原有独立Celery App定义,使用Celery共享任务装饰器:
from celery import shared_task @shared_task def my_multiply(x): print(x) return x
- 调整Celery启动命令
回到项目根目录(即存放manage.py的src-estategy目录),执行如下启动命令:
celery -A proj_estategy worker -l info -P eventlet
- 原有业务代码无需修改
views.py中的任务导入、delay调用逻辑保持原有写法即可正常运行。
内容的提问来源于stack exchange,提问作者Gustaf
相关产品推荐
相关产品推荐

