Heroku Django是如何在生产过程中获取设置文件的?多个设置



这是我第一次部署,所以我只想确保我理解。

基本上,heroku-django是如何确定在部署时选择哪个设置文件的?有没有什么命令我可以键入来检查它当前使用的设置文件?就像它是一个产品或开发。

^^为了自己回答上述问题,您在wsgi文件和heroku配置中设置myproject.settings.prod:set DJANGO_settings_MODULE=mysite.settings_prod,告诉它为生产/部署选择您的产品设置。我的理解正确吗?提前谢谢。任何建议或反馈都将受到重视!

是的,您得出的答案在逻辑上是正确的,但可能不起作用。

将您的wsgi.py更改为设置DJANGO_SETTING_MODULE;查看它运行的位置:(为此,您必须在Heroku中设置环境变量ENV=Heroku(

import os
from django.core.wsgi import get_wsgi_application
if os.getenv("ENV") == "Heroku":
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.production_settings')
else:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.dev_settings')
application = get_wsgi_application()

如果您想使用manage.py runserver来简化开发,也可以将manage.py更改为相同的:

import os
import sys

def main():
"""Run administrative tasks."""
if os.getenv("ENV") == "Heroku":
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.production_settings')
else:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.dev_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()

Q: 为什么这种方法而不是直接在heroku中设置env变量的解决方案?

A: 我还没有测试过,但每次重新启动时,wsgi.py都会运行os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings'),覆盖您在heroku中手动设置的DJANGO_SETTINGS_MODULE环境变量。因此,您必须在wsgi.py.中设置它

首先,我想感谢你的回答,但我的处理方式有点不同。因为我已经拆分了设置文件,目的是根据环境变量加载一个合适的配置文件,所以我通过以下方式解决了这个问题:

if os.environ.get("DJANGO_ENV") == 'prod':
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings.prod'
elif os.environ.get("DJANGO_ENV") == 'dev':
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings.dev'
elif os.environ.get("DJANGO_ENV") == 'test':
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings.test'

为什么?因为os.environment.setdefault('JANGO_SETTING_MODULE','my_app.production_SETTINGS'(总是返回my_app.SETTINGS'。所以问题是它是如何工作的?很简单,首先"设置默认值";检查DJANGO_SETTING_MODULE的环境变量,如果没有找到,则按代码中的原样设置(my_app.production.SETTINGS(,但在大多数情况下,它可能会存在,因此我们不应该使用setdeault,而应该为该变量分配一个新值,如os.environg['JANGO_SETTINS_MODULE']='config.SETTINGS.prod'

最新更新