Celery: auto discovery does not find tasks module in app

前端 未结 7 2168
说谎
说谎 2021-02-19 19:50

I have the following setup with a fresh installed celery and django 1.4:

settings.py:

import djcelery
djcelery.setup_loader()

BROKER_HOST = \'localhost         


        
相关标签:
7条回答
  • 2021-02-19 20:04

    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.

    0 讨论(0)
  • 2021-02-19 20:08

    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')

    0 讨论(0)
  • 2021-02-19 20:12

    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 讨论(0)
  • 2021-02-19 20:12

    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
    
    0 讨论(0)
  • 2021-02-19 20:18

    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)
    
    0 讨论(0)
  • 2021-02-19 20:20

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

    0 讨论(0)
提交回复
热议问题