1、背景简要
在开发过程中,环境分离是一种非常常见的情况,一般分为开发环境和生产环境。还有一些开发环境、日常环境和生产环境。
当环境更多时,我们当然不想在编写代码时每次更改配置。更好的方法是编写多个配置文件,并通过环境变量决定使用哪个配置文件。
Django 默认为使用项目目录 settings.py 作为配置文件,我们将根据开发和生产环境进行讨论 Django 中都有什么方式来动态使用配置文件。
写在前面:
本例的 Django 项目名称为 base_django_api 就是使用 Django-admin创建的工程名称
2、通过shell命令切换配置文件
首先,写两个完全独立的。 settings 配置文件在这里命名 dev_settings.py prod_settings.py 请注意,这两个配置文件可以直接复制到项目目录中替换 settings.py 的。
如下图示:
然后在运营项目前使用 shell 命令直接替换原项目 settings.py
例如:
cp ./config/prod_settings.py ./base_django_api/settings.py # 生产环境使用此命令 cp ./config/prod_settings.py ./base_django_api/settings.py # 开发环境使用此命令
这种方法主要用于应用 docker 在容器中部署服务,不使用 docker 当然,你可以写一个 shell 脚本来控制
另一个缺点是配置项冗余过多,每次更改都不方便
3.通过设置环境变量切换配置文件
例如,在运行服务之前,我们首先定义了一个环境变量,称为它 CURRANT_ENV
判断当前是开发环境还是生产环境的环境变量。
例如:当前CURRANT_ENV=dev
开发环境,CURRANT_ENV=prod
时间是生产环境
切换配置有两种方法:
1.直接在项目配置文件中 settings.py 根据不同的环境变量使用不同的配置
示例:
# settings.py import os, sys, datetime, random from datetime import timedelta CURRENT_ENV = os.getenv('CURRENT_ENV', 'dev') # 获取当前环境,默认为开发环境 # 公共配置 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY = '0b($)a_$n$!grvsj!pob$5z4(q u3fo_)aoz!g)3^=pk@7g770sdfgertgsdf' # 在开发环境时,使用开发配置 if CURRENT_ENV == 'dev': DEBUG = True # 开发数据库 DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', 'NAME': 'base-api', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '3306',
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
'charset': 'utf8mb4',
'sql_mode': 'traditional'
}
}
}
else:
DEBUG = False
# 生产数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'base-api',
'USER': 'root',
'PASSWORD': 'asghs#$zasdg%#',
'HOST': '127.0.0.1',
'PORT': '3706',
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
'charset': 'utf8mb4',
'sql_mode': 'traditional'
}
}
}
这样做的缺点是会导致项目配置文件变的不好维护
下面就有一个更好一点的方式
2、升级版,定义不同的配置文件,在项目配置文件中根据环境变量导入不同的配置
示例:
先定义不同的配置文件
# dev_settings.py
DEBUG = True
# 开发数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'base-api',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
'charset': 'utf8mb4',
'sql_mode': 'traditional'
}
}
}
# prod_settings.py
DEBUG = False
# 生产数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'base-api',
'USER': 'root',
'PASSWORD': 'asghs#$zasdg%#',
'HOST': '127.0.0.1',
'PORT': '3706',
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
'charset': 'utf8mb4',
'sql_mode': 'traditional'
}
}
}
在项目配置文件中根据环境变量导入不同的配置
# settings.py
import os, sys, datetime, random
from datetime import timedelta
CURRENT_ENV = os.getenv('CURRENT_ENV', 'dev') # 获取当前环境,默认为开发环境
# 公共配置
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = '0b($)a_$n$!grvsj!pob$5z4(q+u3fo_)aoz!g)3^=pk@7g770sdfgertgsdf'
# 如果是开发环境时,使用开发配置
if CURRENT_ENV == 'dev':
from config.dev_settings import *
else:
from config.prod_settings import *