Heroku Django 如何在生产过程中获取设置文件?多项设置
How does Heroku Django picks up settings file during production? Multiple settings
这是我第一次部署所以我只是想确保我理解。
基本上,heroku django 在部署时如何确定选择哪个设置文件?
我可以输入任何命令来检查它当前使用的是哪个设置文件吗?就像它是产品还是开发。
^^ 为了自己回答上面的问题,你在 wsgi 文件和 heroku 中设置 myproject.settings.prod config:set DJANGO_SETTINGS_MODULE=mysite.settings.prod 告诉它选择你的production/deploymnent 的产品设置。我的理解正确吗?提前致谢。我们将不胜感激任何建议或反馈!
是的,您得出的答案在逻辑上是正确的,但可能行不通。
将您的 wsgi.py
更改为设置 DJANGO_SETTINGS_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
更改为相同的柜子,以防您想使用 manage.py runserver
以方便开发:
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()
问:为什么用这种方法而不是你的解决方案直接在 heroku 中设置 env 变量?
A: 我没有测试过,但是在每次重启时 wsgi.py
运行s 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.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.production_settings') 总是返回 my_app.settings。
所以问题是它是如何工作的?很简单,首先“setdefault”检查 DJANGO_SETTINGS_MODULE 的环境变量,如果没有找到则按代码设置 (my_app.production.settings) 但可能在大多数情况下,它会存在在那里,所以我们应该为这个变量分配一个新值,而不是使用 setdeault,例如 os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings.prod'
这是我第一次部署所以我只是想确保我理解。
基本上,heroku django 在部署时如何确定选择哪个设置文件? 我可以输入任何命令来检查它当前使用的是哪个设置文件吗?就像它是产品还是开发。
^^ 为了自己回答上面的问题,你在 wsgi 文件和 heroku 中设置 myproject.settings.prod config:set DJANGO_SETTINGS_MODULE=mysite.settings.prod 告诉它选择你的production/deploymnent 的产品设置。我的理解正确吗?提前致谢。我们将不胜感激任何建议或反馈!
是的,您得出的答案在逻辑上是正确的,但可能行不通。
将您的 wsgi.py
更改为设置 DJANGO_SETTINGS_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
更改为相同的柜子,以防您想使用 manage.py runserver
以方便开发:
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()
问:为什么用这种方法而不是你的解决方案直接在 heroku 中设置 env 变量?
A: 我没有测试过,但是在每次重启时 wsgi.py
运行s 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.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.production_settings') 总是返回 my_app.settings。 所以问题是它是如何工作的?很简单,首先“setdefault”检查 DJANGO_SETTINGS_MODULE 的环境变量,如果没有找到则按代码设置 (my_app.production.settings) 但可能在大多数情况下,它会存在在那里,所以我们应该为这个变量分配一个新值,而不是使用 setdeault,例如 os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings.prod'