开发过程中,环境分离是很常见的情况,一般都会分开发环境和生产环境。也有些分开发环境、测试环境、生产环境等。
当环境更多的时候,每次变环境都要改一堆配置,比较好的应对方法就是写多个配置文件,通过环境变量来决定使用哪个配置文件。
多个配置文件
我们可以在 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)