Heroku部署Django时如何选择生产配置文件?如何校验生效配置?
Heroku 判定Django配置文件加载路径的核心逻辑
Heroku本身没有针对Django做特殊的配置识别规则,整个加载判定完全顺着Django原生的配置优先级链路走,优先级从高到低依次为:
- 启动命令中通过
--settings参数显式指定的配置模块路径 - 应用运行时环境变量中的
DJANGO_SETTINGS_MODULE值 - wsgi模块中通过
os.environ.setdefault设置的兜底默认配置路径 - Django项目根目录下的默认
settings.py文件
Heroku的运行容器和本地开发环境完全隔离,不会自动复用你本地电脑设置的环境变量,也不会因为项目代码里拆分了dev/prod配置文件就自动切换生产环境配置,所有配置路径的判定完全基于上述优先级规则。
快速查询实际生效配置、判定运行环境的可用命令
直接使用以下原生命令即可获取准确信息:
- 查看Heroku平台层面为应用注入的所有环境变量:执行
heroku config -a 你的应用名称,输出结果中如果存在DJANGO_SETTINGS_MODULE字段,就能直接看到平台侧注入的配置路径 - 获取最准确的实际加载配置:执行
heroku run python manage.py diffsettings -a 你的应用名称,这个命令会直接输出当前运行时内存中加载的全量配置,结果的首行就会展示实际生效的settings模块路径,不受之前优先级叠加的影响 - 快速验证环境属性:执行
heroku run python manage.py shell -c "from django.conf import settings; print(settings.SETTINGS_MODULE, settings.DEBUG)" -a 你的应用名称,可以直接输出当前加载的配置模块名、DEBUG开关状态,一眼就能判断是开发还是生产配置生效。
对现有认知的校验与实践建议
你梳理的操作方向整体是对的,但存在几个容易踩坑的细节:
- 关于wsgi文件中指定
myproject.settings.prod的操作:默认生成的Django wsgi文件里本来就有一行os.environ.setdefault('DJANGO_SETTINGS_MODULE', '默认配置路径'),把这里的路径改成prod本质是设置一层兜底默认值,不是强制加载。如果后续环境变量、启动命令里指定了其他配置路径,这个兜底值会直接被覆盖,不会强制生效。 - 关于
heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings.prod的操作:命令本身逻辑没问题,但要注意两个常见错误:一是配置路径必须和实际代码文件的路径完全匹配(比如你实际的生产配置文件是myproject目录下的,就不要写成mysite),路径不匹配会直接导致应用启动失败;二是设置完这个环境变量后,不需要强行把wsgi里的默认兜底值改成生产配置——保留wsgi的兜底值为开发环境配置,本地跑的时候自动加载dev配置,Heroku上靠环境变量覆盖成生产配置,反而更灵活,不需要每次部署来回改代码。
实践层面的注意点
- 不要把SECRET_KEY、数据库密码、第三方服务密钥这类敏感配置写在生产settings文件里提交到代码仓库,所有敏感值全部通过
heroku config:set注入环境变量,在settings文件里通过os.environ.get读取,避免代码泄露风险 - 可以在生产配置文件和开发配置文件里分别加自定义标识,比如生产配置里写
IS_PRODUCTION = True,开发配置里写IS_PRODUCTION = False,后续查配置的时候可以快速确认环境状态,不会因为路径写错导致配置混用 - 不建议在Procfile的启动命令里硬编码
--settings参数,否则后续调整配置路径必须修改Procfile重新部署,靠环境变量统一管理配置路径的话,调整时只需要改Heroku的config配置,不需要改动代码 - 每次修改settings相关的配置后,先执行
heroku run python manage.py check -a 你的应用名称,确认配置可以正常加载、没有导入路径错误后,再正式发布应用。
内容的提问来源于stack exchange,提问作者Kentypop
相关产品推荐
相关产品推荐

