Celery 3.1.9 Django integration, specifying settings file, without using djcelery

celery, django

Solution

A solution is to use environment variables.

In celery.py

Instead of

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

use

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{0}'.format(get_env_setting('DJANGO_SETTINGS_MODULE')))

With `get_env_setting` defined as:

from os import environ
from django.core.exceptions import ImproperlyConfigured

# https://github.com/twoscoops/django-twoscoops-project/blob/develop/project_name/project_name/settings/production.py#L14-L21
def get_env_setting(setting):
    """ Get the environment setting or return exception """
    try:
        return environ[setting]
    except KeyError:
        error_msg = "Set the %s env variable" % setting
        raise ImproperlyConfigured(error_msg)

You could put that in your `settings.base.py` e.g. .

Then set the `DJANGO_SETTINGS_MODULE` environment variable for each environment. E.g. set it to `my_project.settings.production` in the production environment. This variable can by permanently set by adding the following line to ~/.bashrc:

export DJANGO_SETTINGS_MODULE=my_project.settings.production

Problem

I began using celery 3.1.9 today with Django. This newer version has a tighter integration with django that removes the need to using django-celery. I use multiple settings files and I was wondering if there was an easy way to specify which settings file to use when initializing the `celery worker`? With djcelery it is quite simply since it uses the manage.py commands. I naively tried to check if `settings.DEBUG` was true in the celery.py file, but of course that failed because the settings were not loaded yet! THe next step is to dive into the django-celery source and emulate what they are doing, but before that, I was hoping someone had found an easy way of achieving this? Thank you

Original source