我想在我的Django项目中使用Celery说“ MySite ”。我的目录结构如下
mysite
- applications
- api
-tasks.py
-urls.py
-apps.py
-__init__.py
-v0
-__init__.py
-urls.py
-views.py
-utils.py
-v1
-__init__.py
-urls.py
-views.py
-utils.py
- backbone
-tasks.py
-urls.py
-apps.py
-views.py
-models.py
-__init__.py
-mysite
- settings.py
我有两个应用程序 api 和 backbone 。我在 api 目录中创建了 tasks.py ,该目录定义了各种Celery任务。我在 v0 和 v1 目录的 utils.py 中定义了各种功能。上述结构仅是实际项目的代表。该项目更大,更复杂。
我很高兴在 v0 / utils.py
中说 func1def func1:
#code
如何将 utils.py 中的 func1 转换为Celery任务,而不移动 func1 的位置或将其导入到 task.py 吗?我只想修改 func1 ,使其表现像芹菜任务,我应该能够应用重试选项等
答案 0 :(得分:3)
在tasks.py
模块(my_celery_task_function()
)中创建一个新任务,然后在其中调用utils函数(util_function_1()
和util_function_2()
)
尝试这样的事情
#v0/utils.py
def util_function_1():
# your code
pass
# v1/utils.py
def util_function_2():
# your code
pass
#api/tasks.py
@app.task
def my_celery_task_function():
from v1.utils import util_function_1
from v2.utils import util_function_2
util_function_1()
util_function_2()
UPDATE-1
这是例子。您可以将 任何有效参数 添加到 @app.tasks()
装饰器。
# v0/utils.py
def func1():
# your code
pass
# api/tasks.py
@app.task(bind=True, default_retry_delay=30 * 60)
def my_celery_task_function_1(self, *args, **kwargs):
from v1.utils import func1
func1()