【问题标题】:Python (django) environment variablesPython (django) 环境变量
【发布时间】:2016-05-07 16:12:40
【问题描述】:

我正在使用 django 和 virtualenvwrapper。我的目标是根据 12Factor 应用程序建议 (http://12factor.net) 从设置文件中删除所有敏感信息,并最终部署到 heroku。在本地测试时,为了实现这一点,我创建了一个具有不同变量值的 .env 文件,例如 SECRET_KEY。我去了我的 virtualenv 目录并将以下行添加到 postactivate 脚本中:

source .env 

每当我为一个项目(即 workon project_name)启动我的虚拟环境时,如果我从终端回显,来自 .env 的环境变量就可用

$ echo $SECRET_KEY
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

但是,当我尝试从 python 访问这些变量时,它们不可用

>>> import os
>>> os.environ.get('SECRET_KEY')
>>> 

python 访问存储在 .env 文件中的环境变量的正确方法是什么?

.env 文件:

WEB_CONCURRENCY=2
SECRET_KEY='XXXXXXXXXXXX'
DEBUG=True

【问题讨论】:

  • 你是export SECRET_KEY 还是只是定义SECRET_KEY=xxxxxxx
  • 我在 .env 中定义了 SECRET_KEY,并且每次运行“workon project_name”时都在获取 .env 文件。我从未在 .env 文件中明确导出它或任何内容。
  • 不,我的意思是你在.env 文件中写了什么。你有export SECRET_KEY=xxxxxSECRET_KEY=xxxxxxx吗?
  • @alexolivas 请出示您的 .env 文件。
  • SECRET_KEY=xxxxxxx

标签: python django heroku foreman env


【解决方案1】:

我认为您的问题是您通过执行SECRET_KEY=xxxxxxx 在当前 shell 中定义它,但是当您打开 python shell 时,它在子进程中运行并且您丢失了该 shell 中的环境变量。 export 也会使变量在子进程中可用。

你应该有:

export SECRET_KEY=xxxxxxxx

在您的.env 文件中使其工作。

编辑:

从我从您的链接中读到的内容,这只是一个普通的 linux shell 环境变量。但是 django 需要在设置中将 SECRET_KEY 作为 python 常量。 Linux环境变量和python变量是两个不同的东西,所以定义一个env变量SECRET_KEY不会让django识别settings.SECRET_KEY。您仍然应该考虑使用单独的设置文件,这主要是推荐的。

【讨论】:

  • 我一直在关注 heroku 的 django 部署指南,他们为此使用了一个 env 文件,这个例子有点不完整,这就是我卡住的地方。另外,我认为维护 1 个设置文件更干净,即使它们都继承自所有常用设置的相同 base_settings。使用 export 有效,但现在我比开始时更困惑,因为您认为这不是好的做法。
  • 哦,我对heroku了解的不够多,也许我错了。我将删除我对设置文件的建议,因为 heroku 可能有一些技巧可以使其与 .env 文件一起使用。但我认为你应该明白为什么需要export。如果您仍想使用多个设置文件,请检查:stackoverflow.com/questions/24071489/…
  • 顺便说一句,我仍然对你在哪里找到指南感兴趣。
  • 我们两个人,我几天前才开始学习heroku。当我的应用托管在 webfaction 上时,我使用了多个设置文件。本教程适用于 django on heroku,而本教程适用于 heroku 使用的 local config vars 以及如何在开发中运行您的代码。
  • 另外,我确实理解出口的必要性。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2018-09-03
  • 1970-01-01
  • 2014-03-06
相关资源
最近更新 更多