如何使用python-decouple管理Django项目多个不同的.env环境文件
多环境.env文件切换方案(基于python-decouple)
python-decouple原生不支持直接在manage.py命令后加--env-file参数指定配置文件,可通过以下几种方式实现多环境文件的切换管理:
方案1:通过环境变量指定配置文件路径
这是最轻量化的实现方式,不需要修改Django框架逻辑:
- 首先修改项目的
settings.py文件,自定义decouple的配置加载逻辑:
import os from decouple import Config, RepositoryEnv # 优先读取系统环境变量中指定的env文件,默认加载开发环境配置 ENV_FILE = os.getenv("DJANGO_ENV_FILE", ".env.dev") config = Config(RepositoryEnv(ENV_FILE)) # 后续所有配置读取都使用该config实例即可,示例如下 DEBUG = config('DEBUG', default=False, cast=bool) SECRET_KEY = config('SECRET_KEY') DATABASES = { 'default': { 'ENGINE': config('DB_ENGINE'), 'NAME': config('DB_NAME'), 'USER': config('DB_USER'), 'PASSWORD': config('DB_PASSWORD'), 'HOST': config('DB_HOST'), 'PORT': config('DB_PORT', cast=int), } }
- 运行Django命令前指定环境变量即可切换配置:
- Linux/macOS环境:
DJANGO_ENV_FILE=.env.prod python manage.py runserver - Windows CMD环境:
set DJANGO_ENV_FILE=.env.prod && python manage.py runserver - Windows PowerShell环境:
$env:DJANGO_ENV_FILE=".env.prod"; python manage.py runserver
方案2:配合Docker使用时直接指定env文件
如果用Docker部署,不需要修改Python代码,直接在Docker启动参数或docker-compose配置中指定env文件即可:
- 直接用Docker命令启动时:
docker run --env-file .env.prod 你的镜像名 - 用docker-compose管理时,在不同环境的compose配置中指定
env_file字段即可,示例:
# docker-compose.prod.yml services: web: build: . command: gunicorn 你的项目名.wsgi:application --bind 0.0.0.0:8000 env_file: .env.prod volumes: - ./:/app ports: - "8000:8000"
启动时指定对应compose文件即可自动加载对应环境配置:docker compose -f docker-compose.prod.yml up -d
方案3:自定义manage.py参数支持--env-file
如果需要完全匹配你提到的--env-file命令格式,可以自行扩展manage.py的逻辑:
修改项目根目录下的manage.py文件,加入参数解析逻辑:
#!/usr/bin/env python import os import sys def main(): # 处理自定义--env-file参数 env_file = ".env.dev" if "--env-file" in sys.argv: arg_index = sys.argv.index("--env-file") if arg_index + 1 < len(sys.argv): env_file = sys.argv.pop(arg_index + 1) sys.argv.pop(arg_index) os.environ["DJANGO_ENV_FILE"] = env_file # 原有Django启动逻辑 os.environ.setdefault('DJANGO_SETTINGS_MODULE', '你的项目名.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()
修改完成后即可直接使用你期望的命令格式切换环境:python manage.py runserver --env-file=.env.prod
注意事项
- 所有.env文件都需要加入
.gitignore规则,避免敏感信息(密钥、数据库密码等)提交到代码仓库 - 可以在仓库中提供
.env.example模板文件,标注所有需要填写的配置项,方便团队成员使用
内容的提问来源于stack exchange,提问作者Johnny Pereira
相关产品推荐
相关产品推荐

