芹菜中的活动Django设置文件

2024-04-30 02:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我已经到处找了很多,但找不到一个好的答案。 我正在使用芹菜3.1.7和Django 1.5.1,没有Django芹菜包装,因为新版本的芹菜不再需要它。 我设法设置任务并使用RabbitMQ执行它们。一切都按计划进行。然而,我正在将其集成到一个现有的、相当大的Django项目中。在这里,我们指定了两个Django设置文件,而不仅仅是一个。我们根据环境运行不同的程序,例如一个用于本地计算机,一个用于服务器。我的问题是,我似乎无法从芹菜worker中跟踪哪些设置文件是“活动的”,它在我的项目根目录中运行芹菜.py文件(正如文档指定的那样)。在这里,文档需要指定如下Django设置文件:

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

现在可以了,但是如果我把东西移到本地,我需要把它改成settings.local才能让它工作,而且每次都是这样。像我在标准Django文件中那样在运行时读取settings对象并没有工作,因为芹菜工人在不同的进程中执行。 那么,在这种情况下,有人知道如何从芹菜工人那里动态获取活动的Django设置文件吗?或者在开始做芹菜工人的时候把它作为一个变量传入?(类似于Django等——settings=project.settings.local) 谢谢!


Tags: 文件项目django答案文档版本projectsettings
3条回答

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

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

例如,对于本地开发,在virtualenv钩子中,在.bashrc中,手动等:

export DJANGO_SETTINGS_MODULE=project.settings.local

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

在命令行上初始化芹菜辅助进程时,只需在芹菜命令之前设置环境变量。

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

相关问题 更多 >