如何用django_celery_results将Celery任务结果保存到数据库?
问题排查与解决步骤
1. 修复配置冲突
你的celery.py初始化Celery实例时指定了backend='db+sqlite:///results.sqlite',但settings.py又设置了CELERY_RESULT_BACKEND = 'django-db',两种配置冲突导致结果后端逻辑混乱。
修改方式:
删除celery.py中初始化app时的backend参数,让settings.py的配置完全生效:
# 修改后的celery.py初始化代码 app = Celery('project', broker='redis://localhost')
2. 完善django-db后端的依赖与配置
使用django-db作为结果后端需要依赖django-celery-results插件,你大概率未完成这部分配置:
- 安装依赖包:
pip install django-celery-results
- 在
settings.py的INSTALLED_APPS中添加插件:
INSTALLED_APPS = [ # 保留原有其他app 'django_celery_results', ]
- 执行数据库迁移,创建存储任务结果的表:
python manage.py migrate django_celery_results
3. 验证任务是否正常完成
从你提供的日志来看,仅显示任务被接收、worker启动,没有任务完成的日志(如Task ... succeeded in ...),说明任务可能仍在运行或抛出了未捕获的异常:
- 调高日志级别查看详细执行情况:
celery -A project worker -l DEBUG
如果任务报错,日志会显示具体错误信息,方便定位问题。
- 测试小难度任务:如果
level值设置过大,寻找符合条件的nounce会耗时极久,导致任务一直无法结束。先设置level=1或level=2测试任务是否能正常完成并写入结果。
4. 确认任务结果保存开关
你的任务装饰器已设置ignore_result=False,这个配置是正确的,确保任务结果会被保存,无需修改。
完成以上步骤后,重启Celery worker,重新触发任务,待任务执行完成后,检查数据库中的django_celery_results_taskresult表,即可看到任务结果。
内容的提问来源于stack exchange,提问作者Omnia Osman
相关产品推荐
相关产品推荐

