Django Celery抛出KeyError问题排查求助
问题原因与解决方案
核心问题:任务名称不匹配
从worker日志能看到,实际加载的任务完整名称是user_statistic_status.tasks.my_test,但你在beat_schedule里配置的任务名是my_test,Celery无法通过短名称找到对应任务,因此抛出KeyError: my_test。
修复步骤
1. 修正beat_schedule中的任务名称
把beat_schedule里的task值改成worker日志显示的完整任务路径:
app.conf.beat_schedule = { 'my-task-every-2-minutes': { 'task': 'user_statistic_status.tasks.my_test', # 替换为完整任务路径 'schedule': crontab(minute='*/1'), }, }
2. (可选)更稳妥的写法:用任务对象的__name__属性
避免手动写路径出错,直接引用任务的__name__属性:
@shared_task def my_test(): print('Celery from task says Hi') app.conf.beat_schedule = { 'my-task-every-2-minutes': { 'task': my_test.__name__, # 直接绑定任务的名称属性 'schedule': crontab(minute='*/1'), }, }
3. 优化建议:迁移beat配置到全局位置
不建议把beat_schedule放在应用的tasks.py里,因为autodiscover_tasks()会扫描所有tasks.py,可能导致配置重复加载。推荐将定时任务配置移到项目根目录的celery.py,或者Django的settings.py中(需添加CELERY_前缀,比如CELERY_BEAT_SCHEDULE)。
验证操作
- 重启beat服务:
celery -A project beat -l info - 重启worker服务:
celery -A project worker -l info - 观察日志,确认任务正常执行且无KeyError抛出
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

