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 Admin 在生产 Heroku 中引发 500 错误
无法获取给定 url 的内容 - Heroku 上的 Django CKEditor
如何从 Heroku 上的 Django 项目正确地提供我的 Angular 应用程序静态文件?