Django-Celery:从另一个应用程序导入到项目的celery.py文件中

时间:2017-03-05 01:10:27

标签: django pycharm celery django-celery

我正在关注here上的教程,以便在我的django项目中定义任务。

文章建议使用以下格式的celery.py文件:

    from celery import Celery
    from celery.schedules import crontab

    app = Celery()

    @app.on_after_configure.connect
    def setup_periodic_tasks(sender, **kwargs):
            # Calls test('hello') every 10 seconds.
            sender.add_periodic_task(10.0, my_task.s('hello'), name='add every 10')
            )

    @app.task
    def my_task(arg):
            print(arg)

哪个有效。现在这很好,但我不想在本地定义我的任务。我的问题是,如何从其他应用程序添加任务?

我创建了一个名为my_proj的空白项目,它有两个应用:my_projapp_with_tasks。上面的celery.py文件位于my_proj应用程序目录的根级别,我想从app_with_tasks的{​​{1}}文件中添加定期任务。

我在tasks.py设置文件的已安装应用中列出了app_with_tasks,但我仍然无法将任何内容从应用导入到其他内容。

我的理解是我应该使用:

my_proj

from app_with_tasks.tasks import task1 将在PyCharm中显示为未解析的引用。

1 个答案:

答案 0 :(得分:1)

我会告诉你我在用什么。也许它可以帮到你

my_proj / celery.py

import os
import celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings')

app = celery.Celery('app_django')

app.config_from_object('django.conf.settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

然后在app_with_tasks中添加文件tasks.py

from my_proj.celery import app
from django.apps import apps

@app.task(bind=False)
def your_task(some_arg):
    A_Model = apps.get_model('my_proj', 'A_Model')
    ....

启动celery服务器的命令(每次更改任务以重新加载tasks.py文件时重启)

/path/to/virtualenv/bin/celery --app=my_proj.celery:app --loglevel=INFO --concurrency=4 -n default_worker worker

调用任务(这里你应该使用你的add_periodic_task代码)

from app_with_tasks.tasks import your_task
your_task.apply_async(args=[123], kwargs=None)