Celery: auto discovery does not find tasks module in app

前端 未结 7 2167
说谎
说谎 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: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

提交回复
热议问题