所以我已经为此寻找了很多,但找不到一个好的答案。 我正在使用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)
谢谢!
答案 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设置文件中提取芹菜设置,这通常是你想要的环境分离。