Aipo: descoberta automática não encontra módulo de tarefas no aplicativo

Eu tenho a seguinte configuração com um novo aipo instalado e 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 

A entrega de mensagens para o celeryd funciona bem, mas a tarefa é sempre não registrada (portanto, a descoberta automática parece não funcionar corretamente aqui). Somente se eu importar o módulo de tasks/__init__.py em tasks/__init__.py a tarefa for encontrada e eu puder usá-lo.

Também a documentação foi um pouco confusa sobre a importação do decorador, mas acho que esta é a certa agora.

Onde está o bug na minha configuração?

Este foi um bug no django-aipo 2.5.4, por favor atualize para 2.5.5!

Adicione CELERY_IMPORTS ao seu settings.py:

 CELERY_IMPORTS = ('testapp.tasks',) 

Importe todas as tarefas no arquivo testapp.tasks.__init__

Em seguida, o Aipo importará todas as tarefas da pasta testapp.tasks e as nomeará como estão

Eu tive o mesmo problema com o django 1.4.1 aipo 3.0.9 e corrigi-lo, nomeando a tarefa.

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

Para qualquer um que tropeça aqui procurando uma solução de problema semelhante.

No meu caso, estava mudando da configuração antiga do INSTALLED_APPS para uma nova configuração baseada no AppConfig .

Novos aplicativos devem evitar o default_app_config. Em vez disso, eles devem exigir que o caminho pontilhado para a subclass AppConfig apropriada seja configurado explicitamente em INSTALLED_APPS .

Para consertar isso, você deve mudar a forma como você entrega os pacotes ao aipo, como declarado aqui na edição de 2248 do Aipo :

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

Em vez do antigo aipo 3 :

 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

Tenho certeza que você tem que importar a “instância do aplicativo Celery” e declarar uma tarefa como esta:

 from project_name.celery import app @app.task def video_process_task(video_id): pass 

note que há um arquivo celery.py na pasta project_dir / project_name, que declara a instância de aipo, assim:

 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) 

conforme instruído na documentação oficial .

Além disso, você deve registrar a tarefa em uma destas três maneiras:

  • a variável CELERY_IMPORTS no arquivo settings.py do projeto Django como na resposta do dgel
  • passing bind=True para o decorador como: @app.task(bind=True)
  • Se você definir autodiscovery para aipo como é feito acima na linha app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) , cada pasta do aplicativo Django pode conter um arquivo tasks.py, e as tarefas declaradas dentro dele serão automaticamente registradas

observe que as alterações nas tarefas REQUIRE A CELERY RESTART devem entrar em vigor