芹菜:自动发现并没有找到应用程序的任务模块(Celery: auto discovery does

2019-07-29 01:34发布

我有一个新的安装芹菜以下设置和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的任务是发现和我可以使用它。

另外,文件是一个有点混乱,对进口的装饰,但我认为这是目前正确的。

哪里是我设置的bug?

Answer 1:

这是Django的芹菜2.5.4的一个bug,请升级到2.5.5!



Answer 2:

添加CELERY_IMPORTS到您的settings.py:

CELERY_IMPORTS = ('testapp.tasks',)

导入所有任务testapp.tasks.__init__文件

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



Answer 3:

我有Django的1.4.1芹菜3.0.9相同的问题,并通过命名任务固定它。

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



Answer 4:

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

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

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

为了解决这个问题,你应该改变方式,你喂包芹菜,因为在这里说2248芹菜问题 :

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

而不是老芹菜3路 :

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


Answer 5:

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

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)

作为指示在官方文档 。

同时,你必须注册任务,在这三种方式中的一种:

  • 在Django项目settings.py文件的CELERY_IMPORTS变量作为dgel的答案
  • 通过bind=True给装饰等: @app.task(bind=True)
  • 如果设置为自动发现芹菜像它的线之上完成app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)每个Django应用程序的文件夹可包含tasks.py文件,并宣布该任务中它会自动注册

注意,更改任务要求芹菜重启生效



文章来源: Celery: auto discovery does not find tasks module in app