2012-04-19 12 views
12

tengo la siguiente configuración con un apio fresco instalado y Django 1.4:Apio: la detección automática no encuentra módulo de tareas en la aplicación

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 

La entrega de mensajes al apiario funciona bien, pero la tarea siempre está no registrada (por lo que el descubrimiento automático no parece funcionar correctamente aquí). Solo si importo el módulo de tareas en tasks/__init__.py, la tarea se encuentra y puedo usarla.

También la documentación era un poco confusa sobre la importación del decorador, pero creo que esta es la correcta ahora.

¿Dónde está el error en mi configuración?

Respuesta

11

¡Esto fue un error en django-apio 2.5.4, actualice a 2.5.5!

+0

Voy a probar esto más tarde, pero como veo en Pypi, 2.5.5 fue lanzado ayer, ¡así que esta es una muy buena información! – Martin

+1

Sí, esto funcionó :) – Martin

20

Añadir CELERY_IMPORTS a su settings.py:

CELERY_IMPORTS = ('testapp.tasks',) 

importar todas las tareas en testapp.tasks.__init__ archivo

Entonces apio importará todas las tareas de la carpeta testapp.tasks y el nombre de ellos, ya que son

+0

He probado esto, pero no ayudó. Solo la importación en el '__init __. Py' de la aplicación hizo que la tarea funcionara. – Martin

+0

Tuve el mismo problema con 2.5.5. Agregar CELERY_IMPORTS funcionó para mí, pero solo junto con un argumento de nombre explícito en el decorador. Simplemente usar @task() genera un KeyError. –

+0

Esto funciona para mí, muchas gracias. –

4

Tuve el mismo problema con django 1.4.1 apio 3.0.9 y lo solucioné nombrando la tarea.

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

+0

¿Hizo algún otro cambio? Estoy teniendo el mismo problema, pero simplemente agregar un nombre no parece resolverlo – sid

+0

Necesitaba reiniciar el cliente de apio. Pero no hice ningún otro cambio. – jantzen05

+0

Parece que no funciona con la sugerencia anterior. – Mutant

0

Estoy bastante seguro de que tiene que importar la "instancia aplicación de apio" y declarar una tarea como esta:

from project_name.celery import app 

@app.task 
def video_process_task(video_id): 
    pass 

nota que hay un archivo en la carpeta celery.py project_dir/project_name, que declara la instancia de apio, de esta manera:

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) 

como se indica en la official documentation.

También, debe registrar la tarea, en una de estas tres maneras:

  • la variable CELERY_IMPORTS en el archivo settings.py del proyecto de Django como en la respuesta de Dgel
  • pasar bind=True al decorador como: @app.task(bind=True)
  • si configura el autodescubrimiento para el apio como se hizo anteriormente en la línea app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) , cada carpeta de la aplicación Django puede contener un archivo tasks.py y las tareas declaradas dentro de este se registrarán automáticamente

nota que los cambios en las tareas requieren que se reinicie el apio en vigor

+0

un reinicio de apio no funciona, necesito eliminar el manú de la carpeta __pycache__. para hacerlo auto descubrimiento de la tarea en los archivos tasks.py ... ¿cuál es el problema aquí? – tyan

1

Para cualquiera que se topa aquí en busca de solución problema similar.

En mi caso, estaba cambiando de la base de las bases del módulo INSTALLED_APPS a una nueva configuración basada en AppConfig.

Las nuevas aplicaciones deben evitar default_app_config. En su lugar, deben exigir que la ruta de puntos a la subclase AppConfig correspondiente se configure explícitamente en INSTALLED_APPS.

Para solucionar este problema, debe cambiar la forma de alimentar a los paquetes de apio, como se ha dicho aquí en el 2248 Celery issue:

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

En lugar de the old Celery 3 way:

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

Y tenga en cuenta que si está utilizando Apio 4, el error fue corregido - https://github.com/celery/celery/issues/3341-- y puede hacer 'app.autodiscover_tasks()' –

Cuestiones relacionadas