来自Celery worker的Active Django设置文件

时间:2014-02-23 22:41:16

标签: python django celery django-celery

所以我已经为此寻找了很多,但找不到一个好的答案。 我正在使用Celery 3.1.7和Django 1.5.1。,没有django-celery包,因为较新版本的Celery不再需要它。 我设法使用RabbitMQ设置任务并执行它们。一切都在应有的地方。但是,我正在将它整合到一个现有的,相当大的Django项目中。在那里我们指定了几个Django设置文件,而不仅仅是一个。我们根据环境运行不同的,例如一个用于本地机器,一个用于服务器。我的问题是,我似乎无法从芹菜工作者中追踪哪个设置文件是“活动的”,芹菜工作者在我的项目根目录中运行celery.py文件(如文档所指定)。那里的文档需要指定Django设置文件,如下所示:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', "project.settings.server")

现在这样可行,但如果我在本地移动这些东西,我需要将其更改为settings.local以使其正常工作,并且每次都可以。像在标准Django文件中那样在运行时读取设置对象不起作用,因为芹菜工作者在不同的进程中执行。 那么,使用这种情况,有没有人知道如何从芹菜工人动态获取活动的Django设置文件?或者也许在启动芹菜工人时将其作为变量传递? (比如Django等--settings = project.settings.local) 谢谢!

4 个答案:

答案 0 :(得分:29)

在命令行初始化celery worker时,只需在celery命令之前设置环境变量。

DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info

答案 1 :(得分:3)

一个想法可能是让Django每次都加载正确的设置文件,让芹菜使用Django正在使用的文件。这就是我如何做到的。

假设你有项目结构:

project/
    proj/
        settings.py
        urls.py
        ...

替换为

project/
    proj/
        settings/
            __init__.py
            local.py
            production.py
            common_settings.py
            ...
        urls.py
        ...

让common_settings.py成为所有环境之间共享的所有设置,并让 init .py加载应该使用的配置。

# __init__.py:

from common_settings import *

# A check for environment variable, hostname, etc:
# Example for checking hostname:
from platform import node
if node() in ['dev1', 'dev2']:
    from local import *
elif node() in ['prod1', 'prod2']:
    from production import *

现在,您始终可以依赖project.proj.settings作为您环境的正确设置文件。

答案 2 :(得分:3)

setdefault()返回系统环境中变量的值。只有在未定义"project.settings.server"的情况下,它才会返回DJANGO_SETTINGS_MODULE

所以,我会在那里留下最常用的设置模块,并在需要时通过明确声明环境变量来更改它:

即。本地开发,你的virtualenv钩子,你的.bashrc,手动等等:

export DJANGO_SETTINGS_MODULE=project.settings.local

答案 3 :(得分:-1)

发现这个埋在芹菜文件中:

# project/app/tasks.py
app = Celery()
app.config_from_object('django.conf:settings')

http://celery.readthedocs.org/en/latest/whatsnew-3.1.html#django-supported-out-of-the-box

这将简单地从django设置文件中提取芹菜设置,这通常是你想要的环境分离。