芹菜:自动发现在应用程序中找不到任务模块

2024-06-25 23:20:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

设置.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

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

此外,文档对于decorator导入也有点混乱,但我认为现在正是这样。

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


Tags: djangopyimportlocalhosthosttaskportsetup
3条回答

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

^{}添加到您的设置中。py:

CELERY_IMPORTS = ('testapp.tasks',)

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

然后,芹菜将从testapp.tasks文件夹导入所有任务并按原样命名

对于那些在这里寻找类似问题解决方案的人来说。

在我的例子中,它是从旧的模块基INSTALLED_APPS设置切换到新的基于AppConfig的配置。

New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in 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)

相关问题 更多 >