[英]Active Django settings file from Celery worker
所以我已经为此寻找了很多,但找不到一个好的答案。 我正在使用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)谢谢!
在命令行初始化celery worker时,只需在celery命令之前设置环境变量。
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"
。
因此,我会将最常用的设置模块留在那里,并在需要时通过显式声明环境变量来更改它:
即本地开发,virtualenv钩子, .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-supported-out-of-the-box
这将简单地从django设置文件中提取芹菜设置,这通常是您想要的环境分离。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.