2012-04-19 22 views
12

Mam następującą konfigurację z zainstalowanym świeżego selera i django 1.4:Seler: auto odkrycie nie znajdzie modułu zadań w aplikacji

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 

Dostarczenie wiadomości do selerad działa dobrze, ale zadanie jest zawsze niezarejestrowane (więc automatyczne odnajdywanie nie działa tutaj poprawnie). Tylko jeśli zaimportuję moduł zadań w tasks/__init__.py, zadanie zostanie znalezione i będę mógł go użyć.

Również dokumentacja była nieco myląca co do importu dekoratora, ale myślę, że teraz jest właściwa.

Gdzie jest błąd w mojej konfiguracji?

Odpowiedz

11

To był błąd w django-selekcji 2.5.4, proszę uaktualnić do wersji 2.5.5!

+0

Mam zamiar przetestować to później, ale jak widzę na Pypi, 2.5.5 zostało wydane wczoraj, więc jest to naprawdę dobra informacja! – Martin

+1

Tak, zadziałało :) – Martin

20

Dodaj CELERY_IMPORTS do settings.py:

CELERY_IMPORTS = ('testapp.tasks',) 

zaimportować wszystkie zadania testapp.tasks.__init__ pliku

Następnie Seler zaimportuje wszystkie zadania z folderu testapp.tasks i wymienić je, ponieważ są one

+0

testowałem tego, ale to nie pomogło. Tylko import w '__init __. Py' aplikacji sprawił, że zadanie działało. – Martin

+0

Miał ten sam problem z 2.5.5. Dodanie CELERY_IMPORTS zadziałało dla mnie, ale tylko razem z jawnym argumentem nazwy w dekoratorze. Po prostu użycie @task() podnosi KeyError. –

+0

To działa dla mnie, wielkie dzięki. –

4

Miałem ten sam problem z django 1.4.1 selerem 3.0.9 i naprawiłem go, nazywając zadanie.

@Task() -> @Task (name = 'testapp.tasks.add')

+0

Czy wprowadziłeś jakieś inne zmiany? Mam ten sam problem, ale samo dodanie nazwy nie rozwiązało tego problemu. – sid

+0

Potrzebowałem zrestartować klienta selera. Ale nie wprowadziłem żadnych innych zmian. – jantzen05

+0

Wygląda na to, że nie działa z powyższą sugestią. – Mutant

0

jestem całkiem pewny, trzeba importować "Seler aplikacji instancji" i zadeklarować zadanie takiego:

from project_name.celery import app 

@app.task 
def video_process_task(video_id): 
    pass 

uwaga, że ​​jest to plik celery.py w/folderu PROJECT_NAME project_dir, który stwierdzi wystąpienie seler, tak:

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) 

zgodnie z instrukcją w official documentation.

również trzeba zarejestrować zadanie, w jednym z tych trzech sposobów:

  • zmienna CELERY_IMPORTS w settings.py plik Django projektu jak w dgel za odpowiedź
  • przechodzącej bind=True do dekoratora jak: @app.task(bind=True)
  • jeśli ustawisz automatyczne wykrywanie dla selera, tak jak dzieje się to powyżej w linii app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) , każdy folder aplikacji Django może zawierać plik tasks.py, a zadeklarowane w nim zadania zostaną automatycznie zarejestrowane

pamiętać, że zmiany do zadania wymagają selera RESTART odniosły skutek

+0

Restart selera nie działa dla mnie, muszę usunąć manule folderu __pycache__. w celu automatycznego wykrywania zadania w plikach tasks.py. Jaki jest problem? – tyan

1

dla każdego, kto szuka tu natyka podobnego rozwiązania problemu.

W moim przypadku przełączenie ze starych baz modułów INSTALLED_APPS na nową konfigurację opartą na AppConfig.

Nowe aplikacje powinny unikać default_app_config. Zamiast tego powinny one wymagać, aby przerywana ścieżka do odpowiedniej podklasy AppConfig była jawnie skonfigurowana w INSTALLED_APPS.

Aby rozwiązać ten problem należy zmienić sposób karmienia pakietów selera, jak podano tu w 2248 Celery issue:

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

Zamiast the old Celery 3 way:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 
+0

Pamiętaj, że jeśli używasz Celery 4, błąd został naprawiony - https://github.com/celery/celery/issues/3341-- i możesz zrobić "app.autodiscover_tasks()" –

Powiązane problemy