Celery:自动发现在app中找不到任务模块

时间:2012-04-19 20:35:00

标签: python django celery django-celery

我使用新安装的芹菜和django 1.4进行以下设置:

settings.py:

import djcelery
djcelery.setup_loader()

BROKER_HOST = 'localhost'
BROKER_PORT = 5672
BROKER_USER = 'user'
BROKER_PASSWORD = 'password'
BROKER_VHOST = 'test'

[...]

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'djcelery',
    'south',
    'compressor',
    'testapp',
]

testapp / tasks.py:

from celery.task import task

@task()
def add(x, y):
    return x + y

向celeryd发送消息的工作正常,但任务始终未注册(因此自动发现似乎无法正常工作)。只有在tasks/__init__.py中导入任务模块时,才能找到任务并且我可以使用它。

此外,文档对装饰器导入有点混乱,但我认为现在这是正确的。

我的设置中的错误在哪里?

7 个答案:

答案 0 :(得分:27)

CELERY_IMPORTS添加到settings.py:

CELERY_IMPORTS = ('testapp.tasks',)

导入testapp.tasks.__init__文件

中的所有任务

然后 Celery 将从testapp.tasks文件夹中导入所有任务并将其命名为

答案 1 :(得分:11)

这是django-celery 2.5.4中的一个错误,请升级到2.5.5!

答案 2 :(得分:5)

我对django 1.4.1 celery 3.0.9也有同样的问题,并通过命名任务来修复它。

@task() - > @task(名称= 'testapp.tasks.add')

答案 3 :(得分:5)

对于任何一个在这里寻找类似问题解决方案的人来说。

就我而言,它是从旧的模块基础INSTALLED_APPS设置切换到基于AppConfig的新配置。

  

新应用程序应避免使用default_app_config。相反,他们应该要求在INSTALLED_APPS 中明确配置相应AppConfig子类的虚线路径。

要解决此问题,您应该更改将包裹送到芹菜的方式,如2248 Celery issue中所述:

from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()]

而不是the old Celery 3 way

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

答案 4 :(得分:2)

我很确定你必须导入“Celery应用程序实例”并声明这样的任务:

from project_name.celery import app

@app.task
def video_process_task(video_id):
    pass

请注意,project_dir / project_name文件夹中有一个celery.py文件,该文件声明了celery实例,如下所示:

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name.settings')
app = Celery('project_name')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

按照official documentation

的说明

另外,您必须以下列三种方式之一注册任务:

  • Django项目的settings.py文件中的CELERY_IMPORTS变量,如dgel的回答
  • bind=True传递给装饰者,如:@app.task(bind=True)
  • 如果您为芹菜设置自动发现,就像在app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)行中所做的那样 ,每个Django应用程序的文件夹都可以包含tasks.py文件,并且在其中声明的任务将自动注册

请注意,对任务的更改需要使CELERY RESTART生效

答案 5 :(得分:0)

就我而言,直到尝试将任务导入外壳程序(pythonpython manage.py shell)之前,我都无法解决问题。

>>> from project_name.tasks import task_add

答案 6 :(得分:0)

加上 Umair A。的答案,我的task.py文件中有一个ImportError异常,这导致Celery未在模块中注册任务。所有其他模块任务均已正确注册。

直到我尝试在Python Shell中导入Celery任务时,该错误才变得明显。我修复了错误的导入语句,然后任务已成功注册。