如今,软件项目多以服务的形式来交付,软件项目也要区分为开发环境,测试环境,预发布环境,生产环境。对于数据库,消息队列,缓存的使用,常用配置文件的方式进行管理, 以降低不同环境下软件功能的差异。
Adam Wiggins在2011年发布了一种软件工程的方,叫做12因素应用(12-Factor App), 后来 Kevin Hoffman增加了3种因素,称为beyond-the-twelve-factor。更多关于12-Factor的内容请参考链接: https://www.12factor.net/zh_cn/
我在梳理业务的时候,在网上查到了关于django-environ的介绍,正好符合需求。以下是我做的一些简单总结:
第一步,安装
pip install django-environ
第二步,修改django的配置文件settings.py
import environ import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent env = environ.Env( # set casting, default value DEBUG=(bool, False) ) # 先从环境变量中获取环境名称, 比如 test prod 等, 如果未指定环境变量,默认为test env_name = env.str('MYENV', 'test') # 根据环境名称,读取对应的环境变量配置文件, 比如 .env.test .env.prod env.read_env('%s/.env.%s' % (BASE_DIR, env_name)) # 读取配置文件中的DEBUG DEBUG = env('DEBUG') # 数据库配置 DATABASES = { 'default': env.db_url('DATABASE_URL'), ... } # 定义的缓存 REDIS_URL = env.dict('REDIS_URL', cast={'value': str}, default={}) # minio服务地址 MINIO_ENDPOINT = env('MINIO_ENDPOINT') ...
第三步,创建配置文件 .env.test和.env.prod :
# .env.test DEBUG=True # 使用env.db_url读取配置时,如果用户名或密码使用了特殊符号,就需要使用urllib.parse.quote()方法转义 # 比如下面的密码是用 urllib.parse.quote('Cnanyi!@#123') 转义得到的 DATABASE_URL=mysql://info:Cnanyi%21%40%231234@127.0.0.1:3306/cnanyi_test # 使用env.dict读取配置时,特殊符号就不需要转义 REDIS_URL='host=127.0.0.1;port=16379;password=123@456;db=12;encoding=utf-8' # 字符串类型的配置,在读取时可以使用简写 ENV('MINIO_ENDPOINT'),其中省略了ENV.str() MINIO_ENDPOINT='127.0.0.1:19000' ...
# .env.prod DEBUG=True # 使用env.db_url读取配置时,如果用户名或密码使用了特殊符号,就需要使用urllib.parse.quote()方法转义 # 比如下面的密码是用 urllib.parse.quote('Cnanyi!@#123') 转义得到的 DATABASE_URL=mysql://info:Cnanyi%21%40%231234@127.0.0.1:3306/cnanyi_prod # 使用env.dict读取配置时,特殊符号就不需要转义 REDIS_URL='host=127.0.0.1;port=6379;password=123@456;db=12;encoding=utf-8' # 字符串类型的配置,在读取时可以使用简写 ENV('MINIO_ENDPOINT'),其中省略了ENV.str() MINIO_ENDPOINT='127.0.0.1:9000' ...
以上要注意的是,写配置文件时要注意格式, [配置名]=[配置值] 之间不能有空格。
第四步,修改完settings.py和配置文件后,在启动django项目时,先指定一个环境变量,即可实现按照不同环境运行程序。
运行测试环境:
MYENV=test python manage.py runserver
运行生产环境:
MYENV=prod python manage.py runserver
如果使用docker或k8s等环境下部署程序时,可将MYENV配置到容器的环境变量上,容器就会以指定的环境运行。
更多关于django-environ的参考资料: https://pypi.org/project/django-environ/
2025/9/11 于北京,上东廓
Здравейте, исках да знам цената ви.
Thank you, this is my first comment