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

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

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

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

【问题讨论】:

    标签: python python-3.x django heroku deployment


    【解决方案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 覆盖部分!谢谢!!
      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 2012-07-22
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2012-08-27
      相关资源
      最近更新 更多