我在我的 django 项目中使用芹菜。
在 celery 任务文件中,我需要导入我的模型,以触发模型方法。但是,我也希望我的模型能够触发某些 celery 任务。
现在我正在将我的模型导入 celery,但是尝试将 celery 任务导入我的模型文件会导致导入循环和导入错误。
解决这个问题的正确方法是什么?
我在我的 django 项目中使用芹菜。
在 celery 任务文件中,我需要导入我的模型,以触发模型方法。但是,我也希望我的模型能够触发某些 celery 任务。
现在我正在将我的模型导入 celery,但是尝试将 celery 任务导入我的模型文件会导致导入循环和导入错误。
解决这个问题的正确方法是什么?
我最终做的是在方法中使用导入,而不是模型文件顶部的一般导入。显然,我并不真的需要循环导入。我的问题是我在 celery 任务文件的顶部导入模型,并在模型文件的顶部导入 celery 任务。那真的没有必要。通过划分进口,我能够避免循环进口问题
Celery 提供了send_task()
允许按名称发送任务的方法,因此无需导入它 - 例如:
# models.py
from celery import current_app
# no need to import do_stuff from tasks because it will be sent by name
current_app.send_task('myapp.tasks.do_stuff', args=(1, 'two'), kwargs={'foo': 'bar'})
更多在文档中。
解决这些看似循环依赖问题的一般方法是分解出模型和任务都可以导入的代码。例如,您可以分解出您提到的模型方法。您的模型将导入此分解后的代码,任务也将如此。
不使用 tasks.py 文件,而只是将任务装饰器应用于 models.py 中的方法怎么样?