2012-04-19 73 views
12

我有一个新鲜的芹菜安装下面的设置和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 

邮件传递到芹菜工作正常,但任务总是未注册(所以自动发现似乎不能在这里正常工作)。只有当我导入tasks/__init__.py中的任务模块时,才能找到任务并且可以使用它。

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

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

回答

11

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

+0

我将在稍后测试,但正如我在Pypi上看到的,2.5.5昨天发布,所以这是一个非常好的信息! – Martin 2012-04-20 08:13:53

+1

是的,这工作:) – Martin 2012-04-21 16:06:33

20

添加CELERY_IMPORTS到您的settings.py:

CELERY_IMPORTS = ('testapp.tasks',) 

进口的所有任务中testapp.tasks.__init__文件

然后芹菜将导入从testapp.tasks文件夹中的所有任务,并命名他们,因为他们是

+0

我测试过这一点,但它没有帮助。只有应用程序的'__init __。py'中的导入才能完成任务。 – Martin 2012-04-20 08:12:52

+0

与2.5.5有同样的问题。添加CELERY_IMPORTS为我工作,但只与装饰器中的显式名称参数一起使用。简单地使用@task()会引发KeyError。 – 2012-05-31 10:29:08

+0

这对我很有用,非常感谢。 – 2017-07-23 14:43:53

4

我有与django 1.4.1芹菜3.0.9相同的问题,并通过命名任务来解决它。

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

+0

你做任何其他改变?我有同样的问题,但只是添加一个名称似乎并没有解决它 – sid 2012-09-03 00:53:36

+0

我需要重新启动芹菜客户端。但我没有做任何其他改变。 – jantzen05 2012-09-11 15:31:03

+0

似乎没有与以上建议一起工作。 – Mutant 2013-01-29 01:55:02

0

我敢肯定你必须导入 “芹菜应用实例”,并宣布这样的任务:

from project_name.celery import app 

@app.task 
def video_process_task(video_id): 
    pass 

注意,有一个在PROJECT_DIR/PROJECT_NAME文件夹,其中宣布芹菜情况下,像这样的celery.py文件:

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文件,其中声明的任务将自动注册

注意,变更任务需要芹菜重新启动才能生效

+0

芹菜重新启动不适用于我,我需要删除__pycache__文件夹manule。使其自动发现tasks.py文件中的任务..这里有什么问题? – tyan 2018-03-05 07:20:05

1

对于谁绊倒在这里寻找类似的问题的解决方案的任何一个。

在我的情况下,它是从旧模块基地INSTALLED_APPS设置切换到一个新的基于AppConfig配置。

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

为了解决这个问题,你应该改变你给包芹菜的方式,如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) 
+0

请注意,如果你使用的芹菜4,错误是固定的 - https://github.com/celery/celery/issues/3341--,你可以做'app.autodiscover_tasks()' – 2017-04-18 15:11:47