[Fixed]-Celery: auto discovery does not find tasks module in app

12👍

This was a bug in django-celery 2.5.4, please upgrade to 2.5.5!

👤asksol

39👍

Add CELERY_IMPORTS to your settings.py:

CELERY_IMPORTS = ('testapp.tasks',)

Import all the tasks in testapp.tasks.__init__ file

Then Celery will import all tasks from testapp.tasks folder and name them as they are

👤dgel

11👍

For any one who stumbles here looking for similar problem solution.

In my case it was switching from old module bases INSTALLED_APPS setting to a new AppConfig based configuration.

New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in INSTALLED_APPS.

To fix this you should change the way you feed packages to celery, as stated here in the 2248 Celery issue:

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

Instead of the old Celery 3 way:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

5👍

I had the same issue with django 1.4.1 celery 3.0.9 and fixed it by naming the task.

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

3👍

In my case, I couldn’t figure out the problem until I tried to import the tasks in shell (python or python manage.py shell).

>>> from project_name.tasks import task_add

2👍

I’m pretty sure you have to import the “Celery app instance” and declare a task like this:

from project_name.celery import app

@app.task
def video_process_task(video_id):
    pass

note that there’s a celery.py file in the project_dir/project_name folder, which declares the celery instance, like this:

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)

as instructed in the official documentation.

also, you must register the task, in one of these three ways:

  • the CELERY_IMPORTS variable in Django project’s settings.py file as in dgel’s answer
  • passing bind=True to the decorator like: @app.task(bind=True)
  • if you set autodiscovery for celery like it is done above in the line app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    , each Django application’s folder can contain a tasks.py file, and the tasks declared inside it will be automatically registered

note that changes to the tasks REQUIRE A CELERY RESTART to take effect

0👍

Adding on to Umair A.’s answer, there was an ImportError exception in my tasks.py file that was causing Celery to not register the tasks in the module. All other module tasks were registered correctly.

This error wasn’t evident until I tried importing the Celery task within a Python Shell. I fixed the bad import statement and then the tasks were successfully registered.

Leave a comment