Celery 3.1.9 Django集成,指定设置文件,不使用djcelery

dm0*_*514 5 django celery

我今天开始和Django一起使用芹菜3.1.9.这个较新的版本与django更紧密地集成,无需使用django-celery.

我使用多个设置文件,我想知道是否有一种简单的方法来指定初始化时使用哪个设置文件celery worker

使用djcelery非常简单,因为它使用manage.py命令.

我天真地试图检查是否

settings.DEBUG 在celery.py文件中是正确的,但当然失败了,因为尚未加载设置!

下一步是潜入django-celery来源并模仿他们正在做的事情,但在此之前,我希望有人找到了一种简单的方法来实现这一目标?

谢谢

Ben*_*ey4 6

解决方案是使用环境变量.

celery.py

代替

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
Run Code Online (Sandbox Code Playgroud)

使用

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{0}'.format(get_env_setting('DJANGO_SETTINGS_MODULE')))
Run Code Online (Sandbox Code Playgroud)

随着get_env_setting定义为:

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)
Run Code Online (Sandbox Code Playgroud)

你可以把它放在你的settings.base.py例子中.

然后DJANGO_SETTINGS_MODULE为每个环境设置环境变量.例如,将其设置my_project.settings.production为生产环境.可以通过在〜/ .bashrc中添加以下行来永久设置此变量:

export DJANGO_SETTINGS_MODULE=my_project.settings.production
Run Code Online (Sandbox Code Playgroud)