如何针对不同的环境(开发,生产等)进行settings.py

时间:2015-10-22 22:37:43

标签: python django

我的项目有几个环境。 DEV用于开发,BETA用于beta测试,PRODUCTION用于生产部署。这些环境中的每一个都共享许多设置,但具有不同的数据库。

我想知道是否有任何优雅的解决方案可以为不同的环境维护settings.py而不会在另一个settings.py文件中重复它们(例如使用继承)

感谢您的回复。

2 个答案:

答案 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

(来自文档的示例!)

相关问题