Django不同环境配置不同settings文件

开发过程中,环境分离是很常见的情况,一般都会分开发环境和生产环境。也有些分开发环境、测试环境、生产环境等。

当环境更多的时候,每次变环境都要改一堆配置,比较好的应对方法就是写多个配置文件,通过环境变量来决定使用哪个配置文件。

多个配置文件

我们可以在 Django 设置文件夹同目录下,根据不同环境,创建不同的 settings 文件:

├── settings.py # 主配置文件
├── settings_dev.py # 开发环境
├── settings_prod.py # 生产环境
├── settings_test.py # 测试环境

这样我们不同环境下的不同的一些的环境配置内容,就可以写在不同的文件下,有两种使用不同配置的方式,下面来一一介绍。

以 settings.py 为主文件

如果以自带的 settings 文件作为配置主文件,其他文件就需要引入到 settings 文件中更新 settings 中的配置内容,具体操作如下:

新增一个环境变量表示目前所用的环境,然后在文件最下面引入对应的配置文件,用引入的配置覆盖当前的默认配置:

# settings.py

CURRENT_ENV = os.getenv('CURRENT_ENV', 'dev')  # 获取当前环境,默认为开发环境

# 在 settings.py 最下面加入
if CURRENT_ENV == "dev":
    from .settings_dev import *

比如我们 settings 文件中有个变量tmp_var,在 settings_dev 文件中同样有一个tmp_var:

# settings.py
tmp_var = "default"

# settings_dev.py
tmp_var = "dev"

# 当我们在Linux中设置环境变量CURRENT_ENV为dev时
print(tmp_var) # 值为dev

常用的环境设置有不同环境配置不同的 mysql 实例、 redis 实例等,简单的 settings_dev 文件内容如下:

# settings_dev.py

DATABASES.update(
    {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': APP_CODE,  # 数据库名
            'USER': 'root',  # 数据库用户
            'PASSWORD': '',  # 数据库密码
            'HOST': '',  # 数据库主机
            'PORT': '3306',  # 数据库端口
        },
    }
)

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': CACHE_LOCATION,
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": CACHE_PASSWORD,
        },
    },
}

当我们把环境变量值设置为dev时,就可以将数据库、缓存实例都切换到 dev 环境对应的实例,而不需要改动配置文件代码。

以每个环境各自的 settings 文件为主文件

Django 加载配置文件的方式,其实是通过 manage.py 执行的,我们看一下 manage.py 中的代码:

import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "middleware_apollo.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == "__main__":
    main()

上面的代码很短,manage.py 会去寻找DJANGO_SETTINGS_MODULE这个环境变量的值,默认就是项目自动生成的 settings.py 文件,根据这个,我们就可以自定义启动时要寻找的配置文件,实现不同环境的配置。

了解了这点后,我们先来看 settings 要如何改动,我们仍然是以 dev 环境为例,其他环境同理。

# settings_dev.py

from settings import *

DATABASES = (
    {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "",  # 数据库名
            'USER': '',  # 数据库用户
            'PASSWORD': '',  # 数据库密码
            'HOST': 'localhost',  # 数据库主机
            'PORT': '3306',  # 数据库端口
        },
    }
)

DEBUG = True

我们在 settings_dev 文件中,需要引入 settings.py 中的所有公共配置内容from settings import *,然后在 settings_dev 中,再定义自己的内容或者覆盖需要改动的默认内容即可。

在manage.py中,配置 settings 映射以及对应的环境变量:

ENV = os.environ.get('CURRENT_ENV', 'default')
ENVIRONMENT = {
    'dev': 'middleware_apollo.settings_dev',
    'default': 'middleware_apollo.settings',
}.get(ENV)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", ENVIRONMENT)

仍然是通过一个环境变量CURRENT_ENV的设置,既可修改目前项目所处的环境。

当有其他环境的配置文件时,只需要按照上面的步骤,并且新增一个环境的映射即可,比如增加 test 环境:

ENVIRONMENT = {
    'dev': 'middleware_apollo.settings_dev',
    'default': 'middleware_apollo.settings',
    'test': 'middleware_apollo.settings_test',
}.get(ENV)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tlqwanttolearnit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值