在django中使用django-environ管理应用环境变量

0
(0)

如今,软件项目多以服务的形式来交付,软件项目也要区分为开发环境,测试环境,预发布环境,生产环境。对于数据库,消息队列,缓存的使用,常用配置文件的方式进行管理, 以降低不同环境下软件功能的差异。

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 于北京,上东廓

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

2 thoughts on “在django中使用django-environ管理应用环境变量

回复 Georgefag 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注