在开发,登台和生产之间分离自定义设置变量

时间:2012-02-09 19:18:48

标签: django

我正在关注项目结构as laid out by Zachary Voase,但我正在努力解决一个具体问题。

我非常希望有一个我将在项目中使用的自定义设置布尔变量(我们称之为SEND_LIVE_MAIL)。基本上,我想在我的代码中使用此设置变量,如果SEND_LIVE_MAIL为True,则实际发送邮件,而当它设置为False时,只需将其内容打印到控制台。后者将适用于开发环境以及运行单元测试时。

实现这个的好方法是什么?目前,根据环境,django服务器使用dev,staging或prd设置,但对于自定义设置变量,我认为这些变量需要“按字面意思”导入。换句话说,我会在我的观点中使用类似

的内容
from settings.development import SEND_LIVE_MAIL

当然不是我想要的。我希望能够做到这样的事情:

from settings import SEND_LIVE_MAIL

并根据环境,将正确的值分配给SEND_LIVE_MAIL变量。

提前致谢!

4 个答案:

答案 0 :(得分:6)

您无论如何都不应直接从您的设置文件导入。使用:

>>> from django.conf import settings
>>> settings.SEND_LIVE_MAIL
True

答案 1 :(得分:3)

最简单的解决方案是将其放在设置文件的底部:

try:
    from local_settings import *
except ImportError:
    pass

在local_settings.py中指定所有特定于环境的覆盖。我通常不会将此文件提交给版本控制。

有更高级的方法,最终得到默认设置文件和每个环境覆盖。

David Cramer的这篇文章介绍了各种方法,包括我提到过的两种方法:http://justcramer.com/2011/01/13/settings-in-django/

答案 2 :(得分:2)

import os
PROJECT_PATH = os.path.dirname(__file__)
try:
    execfile(os.path.join(PROJECT_PATH, local_settings.py'))
except IOError:
    pass

然后,您可以将local_settings.py的行为视为直接粘贴到settings.py

$ cat local_settings.py
INSTALLED_APPS += ['foo']

答案 3 :(得分:1)

您可以针对各种基于环境的设置执行类似的操作,但这里只是SEND_LIVE_MAIL的示例。

<强> settings_config.py

import re
import socket

class Config:
    def __init__(self):
        fqdn = socket.getfqdn()
        env = re.search(r'(devhost|stagehost|prodhost)', fqdn)
        env = env and env.group(1)
        env = env or 'devhost'
        if env == 'devhost':
            self.SEND_LIVE_MAIL = # whatever
        elif env == 'stagehost':
            self.SEND_LIVE_MAIL = # whatever
        elif env == 'prodhost':
            self.SEND_LIVE_MAIL = # whatever

config = Config()

<强> settings.py

from settings_config import config

SEND_LIVE_MAIL = config.SEND_LIVE_MAIL