我的项目有几个环境。 DEV
用于开发,BETA
用于beta测试,PRODUCTION
用于生产部署。这些环境中的每一个都共享许多设置,但具有不同的数据库。
我想知道是否有任何优雅的解决方案可以为不同的环境维护settings.py
而不会在另一个settings.py
文件中重复它们(例如使用继承)
感谢您的回复。
答案 0 :(得分:8)
设置文件只是python模块。通常,使用以下结构:
settings/
|-- base.py
|-- production.py
|-- development.py
然后,在特定于环境的设置中,在文件顶部导入所有常用设置:
from .base import *
然后将DJANGO_SETTINGS_MODULE
环境变量指向适当的设置模块。
答案 1 :(得分:2)
正如@knbk所说,django使用 DJANGO_SETTINGS_MODULE 控制他们的设置。但是,您会看到,一旦您开始使用更多基于设置的应用(如oauth应用),将导致您忘记在所有 settings.py 文件中复制自定义变量。
为了避免这种手动同步环境,我认为最好的方法是设置基于类的设置方案。一种直接的方法是使用此包django-classy-settings。使用django-classy-settings,您可以避免错过复制自定义(但常见)设置。
在文档中我们有一个简单的(用法示例)[http://django-classy- settings.readthedocs.org/en/latest/simple.html]。
假设你的项目是这样的:
myProj/
manager.py
myProj/
setting.py
app1/
app2/
现在您需要将 settings.py 转换为文件夹
myProj/
manager.py
myProj/
setting/__init__.py
app1/
app2/
然后,在 settings / __ init __。py :
上import os
import cbs
class BaseSettings(cbs.BaseSettings):
PROJECT_NAME = 'myproject'
# ... your general default settings ...
class LocalSettings(BaseSettings):
# Settings for local development
class StagingSettings(BaseSettings):
# ...
DOCROOT = '/path/to/docroot/'
def STATIC_ROOT(self):
return os.path.join(self.DOCROOT, 'static', '')
def MEDIA_ROOT(self):
return os.path.join(self.DOCROOT, 'media', '')
class ProductionSettings(StagingSettings):
DEBUG = False
MODE = os.environ.get('DJANGO_MODE', 'Local').title()
cbs.apply('{}Settings'.format(MODE), globals())
因此,您现在可以通过环境变量控制设置。
DJANGO_MODE=staging ./manage.py runserver
(来自文档的示例!)