在Django 4.2视图中调用Celery 5.5.1任务时出现'delay_on_commit'属性不存在的问题
在Django 4.2视图中调用Celery 5.5.1任务时出现'delay_on_commit'属性不存在的问题
嗨,我来帮你搞定这个问题!
首先得明确:你用@shared_task装饰的Celery任务本身并没有delay_on_commit这个方法,这就是报错的根源。你想实现的应该是「在Django事务提交后再执行Celery任务」的效果对吧?下面给你两种靠谱的解决方式:
方法一:用Celery原生的apply_async加on_commit参数
直接修改视图里的任务调用代码就行,把delay_on_commit换成带参数的apply_async:
# django view def testview(request): from tasks import generate_report # 替换原来的delay_on_commit调用 generate_report.apply_async(args=["mytestdata"], on_commit=True) return render(request, "simple_pag...")
apply_async是Celery任务的标准异步调用方法,加上on_commit=True后,Celery会自动绑定当前Django事务,等事务成功提交后再触发任务,完美契合你的需求。
方法二:用Django自带的事务钩子
如果需要更灵活的控制(比如提交后要执行多个操作),可以用Django的transaction.on_commit:
# django view from django.db import transaction def testview(request): from tasks import generate_report # 定义要在事务提交后执行的函数 def run_report_task(): generate_report.delay("mytestdata") # 注册钩子,事务提交后自动执行 transaction.on_commit(run_report_task) return render(request, "simple_pag...")
这种方式是Django官方推荐的事务后操作方式,不管你用不用Celery都能适用,兼容性更强。
最后提醒一句:确保你的视图是在事务上下文里(Django默认视图会自动开启事务),如果你的视图手动关闭了事务,那on_commit会立刻执行任务哦。
备注:内容来源于stack exchange,提问作者Davy
相关产品推荐
相关产品推荐

