来自Celery worker的活动Django设置文件



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

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

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

在命令行初始化celener工作程序时,只需在执行celener命令之前设置环境变量。

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

一个想法是让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作为适合您环境的设置文件。

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

因此,我将把最常用的设置模块留在那里,并在需要时通过显式声明环境变量来更改它:

即,用于本地开发,在您的虚拟挂钩中,在.bashrc中,手动等:

export DJANGO_SETTINGS_MODULE=project.settings.local

在芹菜文档中发现了这一点:

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

http://celery.readthedocs.org/en/latest/whatsnew-3.1.html#django-支持开箱即用

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

相关内容

  • 没有找到相关文章

最新更新