MaR*_*NkO 13 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")
Run Code Online (Sandbox Code Playgroud)
现在这个工作,但如果我在本地移动东西我需要改变它settings.local以使其工作,并且每次.像在标准Django文件中那样在运行时读取设置对象不起作用,因为芹菜工作者在不同的进程中执行.那么,使用这种情况,有没有人知道如何从芹菜工人动态获取活动的Django设置文件?或者也许在启动芹菜工人时将其作为变量传递?(比如Django等--settings = project.settings.local)谢谢!
小智 32
在命令行初始化celery worker时,只需在celery命令之前设置环境变量.
DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info
一种想法可能是让 Django 每次加载正确的设置文件,并让 celery 使用 Django 正在使用的文件。我就是这么做的。
假设您有项目结构:
project/
proj/
settings.py
urls.py
...
Run Code Online (Sandbox Code Playgroud)
用。。。来代替
project/
proj/
settings/
__init__.py
local.py
production.py
common_settings.py
...
urls.py
...
Run Code Online (Sandbox Code Playgroud)
让 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 *
Run Code Online (Sandbox Code Playgroud)
现在,您始终可以信赖 project.proj.settings 作为适合您环境的正确设置文件。