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'