python - 使用 django-configurations 拆分配置文件

标签 python django configuration split settings

django-configurations 是为 Django 构建的一个包,它使用面向对象的模式扩展了基于模块的设置加载。

该包使用 DJANGO_SETTINGS_MODULEDJANGO_CONFIGURATION 环境变量来识别设置文件并分别加载适当的配置。

我想将配置(每个对象)拆分成单独的文件,但遇到困难。

目前;

    settings/settings.py

想改成;

    settings/base.py  
    settings/local.py  
    settings.production.py

有没有人设法实现这一目标,或者可能知道实现这一目标的可行解决方案?

最佳答案

DJANGO_CONFIGURATION 变量引用了一个configurations.Configuration 子类。如 usage patterns 上的文档中所述,这个想法是在维护多个设置文件的繁琐开销中换取更多的 DRYer Mixin/Class 工作流方案。我知道必须去更改 manage.pywsgi.py 很烦人,但您会得到很多。

# example settings.py
from configurations import Configuration, values

# Build up some mixin classes for related or app-specific settings:
class AppsMixin(object):
    DJANGO_APPS = (
        'django.contrib.auth', 'django.contrib.contenttypes',
        'django.contrib.sessions', 'django.contrib.messages', 
        'django.contrib.staticfiles', 'django.contrib.sites',
        'django.contrib.flatpages', 'django.contrib.sitemaps',
        'django_extensions'
    )
    ADMIN_APPS = ('filebrowser', 'grappelli', 'django.contrib.admin',)
    DEV_APPS = ('django.contrib.admindocs', 'debug_toolbar',)
    DEFAULT_APPS = (
        'tagging', 'imagekit',
        'tinymce', 'ajax_select',
        'crispy_forms', #...
    )

    @property
    def INSTALLED_APPS(self):
        """ Control application ordering dynamically """
        OUT_APPS = self.DJANGO_APPS + self.ADMIN_APPS
        if self.DEBUG:
            OUT_APPS += self.DEV_APPS
        return  OUT_APPS + self.DEFAULT_APPS

class AuthURLMixin(object):
    LOGIN_REDIRECT_URL = 'site-login-success'
    LOGIN_URL = '/auth/login/'
    LOGOUT_URL = '/auth/logout/'

class CrispyFormsMixin(object):
    """ django-crispy-forms specific settings """
    CRISPY_TEMPLATE_PACK = 'bootstrap3'

    @property
    def CRISPY_FAIL_SILENTLY(self):
        return not self.DEBUG

class Base(AppsMixin, AuthURLMixin, CrispyFormsMixin, Configuration):
    """ Your equivalent for settings/base.py """
    pass

class Local(Base):
    """ ~ settings/local.py """
    DEBUG = True
    TEMPLATE_DEBUG = DEBUG
    # Custom setting that lets subclasses or your apps
    # check which subclass is active.
    STAGING = False
    # Enable a setting to be defined in os.environ, with a sensible default
    # Don't forget the 'DJANGO_' prefix (e.g. DJANGO_TIME_ZONE) 
    TIME_ZONE = values.Value('America/New_York')
    HTTPS_ONLY = False
    # Stash the secret key in os.environ as DJANGO_SECRET_KEY
    SECRET_KEY = values.SecretValue()

    @property
    def CSRF_COOKIE_SECURE(self):
        """ chained dynamic setting """
        return self.HTTPS_ONLY

    @property
    def SESSION_COOKIE_SECURE(self):
        """ chained dynamic setting """
        return self.HTTPS_ONLY

class Staging(Local):
    """ This class is used for testing before going production """
    STAGING = True 
    TIME_ZONE = values.Value('America/Phoenix')
    #...

class Prod(Staging):
    """ ~ settings/production.py """
    DEBUG = False
    STAGING = False
    HTTPS_ONLY = True

然后,从您的笔记本电脑:

/path/to/project/$ python manage.py shell --configuration=Local
>>>from django.conf import settings
>>>settings.DEBUG, settings.STAGING, settings.TIME_ZONE
(True, False, 'America/New_York')    

从您的远程服务器:

/path/to/remote/project/$ python manage.py shell --configuration=Staging
>>>from django.conf import settings
>>>settings.DEBUG, settings.STAGING, settings.TIME_ZONE
(True, True, 'America/Phoenix')

一旦一切都完美了,就进入系统范围:

# /etc/environment
DJANGO_SETTINGS_MODULE=thisproject.settings
DJANGO_CONFIGURATION=Prod

现在三个文件的问题已经解决了一些额外的问题:

  • 动态属性允许您切换或插入任何数字 通过实例方法一次完成相关设置。
  • 可以通过 mixin 引入和删除大量设置。
  • 敏感的 key 设置不受源代码控制。

因此,您可以想象地制作三个这样的文件,每个文件包含三个类,但为什么不只制作一个包含九个类的文件呢?

关于python - 使用 django-configurations 拆分配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19938192/

相关文章:

python - 在 stdout 和 stderr 之外的其他位置打印

django - 类型错误 : __init__() got an unexpected keyword argument 'show_preview'

Sharepoint 工作流 : Where to store configuration settings?

reactjs - 从创建 react 应用程序和 "take back control"中弹出项目是否有意义

javascript - 降低 Google App Engine 成本

字符串中有空格时 Python 正则表达式变慢

python - Django 中的 db_type (尝试安装 pootle w/mysql)

xml - SMTP Appender - log4net 问题

python - 我可以从列表中调用函数吗? (python2.7)

python - jinja2模板引擎中的这个 "-"是做什么的?