2012-04-19 10 views
12

Ho la seguente configurazione con un sedano fresco installato e Django 1.4:Sedano: rilevamento automatico non trova il modulo compiti app

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 

Il recapito del messaggio al celeryd funziona correttamente, ma l'attività è sempre non registrata (quindi l'auto discovery non sembra funzionare correttamente qui). Solo se importare il modulo delle attività in tasks/__init__.py viene trovata l'attività e posso usarla.

Anche la documentazione è stata un po 'di confusione sull'importazione del decoratore, ma penso che ora sia quella giusta.

Dove si trova il bug nel mio setup?

risposta

11

Questo era un bug in django-celery 2.5.4, eseguire l'aggiornamento a 2.5.5!

+0

Lo metterò alla prova più tardi, ma come ho visto su Pypi, 2.5.5 è stato rilasciato ieri, quindi questa è davvero una buona informazione! – Martin

+1

Sì, funzionava :) – Martin

20

Aggiungi CELERY_IMPORTS al settings.py:

CELERY_IMPORTS = ('testapp.tasks',) 

Importa tutti i compiti in testapp.tasks.__init__ file di

Poi sedano importerà tutte le attività dalla cartella testapp.tasks e assegnare loro un nome come sono

+0

Ho provato questo, ma non ha aiutato Solo l'importazione nel file '__init __. Py' dell'applicazione ha funzionato. – Martin

+0

Aveva lo stesso problema con 2.5.5. L'aggiunta di CELERY_IMPORTS ha funzionato per me, ma solo con un argomento esplicito del nome nel decoratore. Semplicemente usando @task() si solleva un KeyError. –

+0

Questo funziona per me, grazie mille. –

4

Ho avuto lo stesso problema con django 1.4.1 celery 3.0.9 e l'ho risolto nominando l'attività.

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

+0

Hai fatto altre modifiche? Sto riscontrando lo stesso problema, ma l'aggiunta di un nome non sembra risolverlo – sid

+0

Avevo bisogno di riavviare il client di sedano. Ma non ho fatto nessun altro cambiamento. – jantzen05

+0

Sembra non funzionare con i suggerimenti di cui sopra. – Mutant

0

Sono abbastanza sicuro che si deve importare il "Sedano istanza app" e dichiarare un compito come questo:

from project_name.celery import app 

@app.task 
def video_process_task(video_id): 
    pass 

nota che c'è un file nella cartella celery.py project_dir/PROJECT_NAME, che dichiara l'istanza di sedano, come questo:

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) 

come indicato nella official documentation.

anche, è necessario registrare il compito, in uno di questi tre modi:

  • la variabile CELERY_IMPORTS nel file di settings.py del progetto Django come nella risposta di dgel
  • passando bind=True al decoratore come: @app.task(bind=True)
  • se si imposta autodiscovery per il sedano come è fatto sopra nella riga app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) , ciascuna cartella dell'applicazione Django può contenere un file tasks.py e le attività dichiarate al suo interno verranno automaticamente registrate

nota che cambia ai compiti richiedono un riavvio SEDANO abbiano effetto

+0

un riavvio di sedano non funziona per me, ho bisogno di cancellare il manule di cartella __pycache__. per farlo scoprire automaticamente l'attività nei file tasks.py .. qual è il problema qui ?? – tyan

1

perché chi si imbatte qui in cerca di una soluzione simile problema.

Nel mio caso si stava passando da una vecchia base di modulo INSTALLED_APPS ad una nuova configurazione basata su AppConfig.

Le nuove applicazioni dovrebbero evitare default_app_config. Dovrebbero invece richiedere il percorso punteggiato nella sottoclasse AppConfig appropriata da configurare esplicitamente in INSTALLED_APPS.

Per risolvere questo problema è necessario cambiare il modo in cui si alimentano i pacchetti di sedano, come indicato qui in 2248 Celery issue:

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

Invece di the old Celery 3 way:

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

E si noti che se si utilizza Celery 4, il bug è stato risolto - https://github.com/celery/celery/issues/3341-- e si può fare 'app.autodiscover_tasks()' –

Problemi correlati