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

Posted

技术标签:

【中文标题】Heroku Django 在生产过程中如何获取设置文件?多种设置【英文标题】:How does Heroku Django picks up settings file during production? Multiple settings 【发布时间】:2021-07-19 12:39:03 【问题描述】:

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

基本上,heroku django 在部署时如何确定选择哪个设置文件? 我可以输入任何命令来检查它当前使用的设置文件吗?就像它是产品还是开发一样。

^^ 要自己回答上述问题,您在 wsgi 文件和 heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings.prod 中设置 myproject.settings.prod 来告诉它为生产/部署选择您的 prod 设置。我的理解正确吗?提前致谢。任何建议或反馈都将不胜感激!

【问题讨论】:

【参考方案1】:

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

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'

【讨论】:

【参考方案2】:

是的,您提出的答案在逻辑上是正确的,但可能行不通。

将您的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 运行os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings') 覆盖你在heroku 中手动设置的DJANGO_SETTINGS_MODULE 环境变量。所以,你必须在 wsgi.py 中设置它。

【讨论】:

非常感谢!!!这真的很有帮助,尤其是 wsgi 覆盖部分!谢谢!!

以上是关于Heroku Django 在生产过程中如何获取设置文件?多种设置的主要内容,如果未能解决你的问题,请参考以下文章

传输数据 | Django Heroku

Django Admin 在生产 Heroku 中引发 500 错误

无法获取给定 url 的内容 - Heroku 上的 Django CKEditor

如何从 Heroku 上的 Django 项目正确地提供我的 Angular 应用程序静态文件?

Django:Heroku 上的生产应用程序找不到带有“路径”urlpattern 的模板

使用 heroku 在生产中部署媒体和静态的 django 设置和 url 应该是啥样的?