2012-04-19 69 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