首页 > 解决方案 > Django 项目中的每个登台实例/版本都有一个设置文件是否正常?

问题描述

有些人只为他们的项目使用一个设置文件。一个不错的选择是编写模块,将一个设置文件替换为一个目录,其中包含针对每个特定需求的配置:

...    
|    
settings    
|    
|-base.py    
|-local.py    
|-local_alex.py    
|-production.py    
|-staging.py    
|-test.py   

我想只有一个用于生产的设置文件是正常的。

但是如果我有更多的暂存实例/版本会发生什么?假设我为每个登台实例/环境都有一个 postgresql 数据库。可以有更多的暂存文件吗?或者我应该以另一种方式处理暂存版本之间的差异?

所以我可以有两个设置文件,一个用于每个暂存版本,或者使用相同的设置文件,但以另一种方式指定这些差异。

推荐的方法是什么?

DjangoTwoScoops 建议有更多的 local.py 设置文件,但没有人提到几个暂存文件。

例如,我有生产、本地和测试文件。但是有两个暂存版本,每个版本都有一个 URL 和不同的数据库。

DATABASES = {  
    'default': {    
        ...   
        'NAME': 'dbname1',    
        'USER': 'username1',   
       ...    
    }   
}    

and the second one:

DATABASES = {    
    'default': {    
        ...   
        'NAME': 'dbname2',   
        'USER': 'username2',   
       ...     
    }     
}   

标签: pythondjango

解决方案


使用基本设置文件来定义可以被环境变量覆盖的通用设置是一个好主意。所以你的数据库设置可能看起来像;

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ.get('DATABASE_HOST', 'localhost'),
        'PORT': os.environ.get('DATABASE_PORT', '3306'),
        'USER': os.environ.get('DATABASE_USER', 'root'),
        'PASSWORD': os.environ.get('DATABASE_PASSWORD', ''),
        'NAME': os.environ.get('DATABASE_NAME'),
    },
}

您提供的示例是很好的做法,但我会避免为一个人使用特定文件,或者如果可以的话,避免使用特定的本地设置。相反,希望有环境变量来解释否则会获得它自己的设置文件。这样,在每个服务器/环境上维护和轻松配置的代码就更少了。您的项目运行的每个环境都会DJANGO_SETTINGS_MODULE在环境变量中定义,以告诉 django 要使用哪些设置。

使用特定于环境的设置文件来继承基础,然后包括日志记录和错误通知等内容,如果您订阅了像Sentry这样的服务,您不希望将其集成到生产之外。因此production.py可能包括在该环境中运行时需要的其他安全设置;

DEBUG = False

CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True

SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = False

如果您发现本地设置方法适合您,请将它们从 git 中排除,这样特定人员的设置就不会被签入,如果他们有本地数据库服务器,他们就不必担心密码是否存在永远在版本控制等。


推荐阅读