如何在Django中区分本地与生产环境配置?非Docker环境下指定.env文件启动项目的最优方案
在非Docker环境下指定.env文件启动Django的最佳方案
我来分享几个实际项目中常用的靠谱方法,完美解决你想要通过参数指定.env文件启动Django的需求:
方案1:用django-environ支持命令行指定.env路径(最推荐)
django-environ是Django生态里专门管理环境变量的工具,能轻松实现你想要的--env参数指定功能,步骤如下:
- 首先安装依赖:
pip install django-environ
- 在你的
base.py配置文件中修改环境变量读取逻辑,让它能识别命令行参数:
import environ import sys # 初始化environ实例 env = environ.Env() # 从命令行参数中提取--env指定的文件路径 env_file_path = None for idx, arg in enumerate(sys.argv): if arg.startswith('--env='): env_file_path = arg.split('=')[1] # 移除这个自定义参数,避免Django的runserver命令报错 sys.argv.pop(idx) break # 读取指定的.env文件,没指定的话默认用.env.local if env_file_path: env.read_env(env_file_path) else: env.read_env('.env.local')
- 现在启动项目就可以直接用你想要的命令了:
python manage.py runserver --env=./.env.local
这个方式最符合你的需求,而且代码层面统一管理,后续扩展也方便。
方案2:通过环境变量传递.env路径(简洁高效)
如果不想处理命令行参数,也可以通过环境变量来指定.env文件,改动更小:
- 在
base.py中修改:
import environ import os env = environ.Env() # 读取ENV_FILE环境变量指定的文件,默认 fallback 到.env.local target_env_file = os.environ.get('ENV_FILE', '.env.local') env.read_env(target_env_file)
- 启动时直接设置环境变量即可:
ENV_FILE=./.env.local python manage.py runserver
这个方式不需要修改命令行参数的处理逻辑,适合喜欢简洁配置的场景。
方案3:优化你的Shell脚本(无代码改动)
如果不想修改Django代码,也可以把你的现有脚本优化得更健壮,支持--env参数:
创建一个start.sh脚本:
#!/bin/bash # 默认使用.env.local ENV_FILE=".env.local" # 解析命令行参数 while [[ $# -gt 0 ]]; do case "$1" in --env=*) ENV_FILE="${1#*=}" shift ;; *) # 保留其他参数(比如runserver的端口) break ;; esac done # 导出.env中的环境变量(跳过注释行) export $(grep -v '^#' "$ENV_FILE" | xargs) # 启动Django,传递剩余的参数 python manage.py runserver "$@"
给脚本加执行权限:
chmod +x start.sh
然后启动项目:
./start.sh --env=./.env.local
这个方案完全不需要改动Django代码,纯Shell层面解决问题。
额外注意事项
- 所有.env文件都要加入
.gitignore,避免把数据库密码、密钥等敏感信息提交到代码仓库。 - 如果你的
settings拆分是config/settings/base.py、local.py、production.py这种结构,启动不同环境的配置时可以结合--settings参数,比如生产环境:
ENV_FILE=./.env.prod python manage.py runserver --settings=config.settings.production
内容的提问来源于stack exchange,提问作者Скелетор Кольт 1911 9мм
相关产品推荐
相关产品推荐

