2016-01-29 114 views
1

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

source .env 

每当我开始我的虚拟ENV一个项目又名workon PROJECT_NAME,从.ENV环境变量都可以,如果我从终端回声

$ echo $SECRET_KEY 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 

然而,当我尝试从蟒蛇访问这些变量,它们是不可用

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

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

.ENV文件:

WEB_CONCURRENCY=2 
SECRET_KEY='XXXXXXXXXXXX' 
DEBUG=True 
+0

你是'export'' SECRET_KEY'还是只定义'SECRET_KEY = xxxxxxx'? –

+0

我在.env里面定义了SECRET_KEY,并且在每次运行“workon project_name”时都会找到.env文件。我从来没有明确地将它或任何内容导出到.env文件中。 – alexolivas

+0

不,我的意思是你在'.env'文件中写的是什么。你有'export SECRET_KEY = xxxxx'或'SECRET_KEY = xxxxxxx'吗? –

回答

0

我觉得你的问题是,你正在做SECRET_KEY=xxxxxxx定义它在当前的shell,但是当你打开一个python外壳,它在一个子过程的运行和你在该shell中丢失了环境变量。 export也会使子过程中的变量可用。

你应该有:

export SECRET_KEY=xxxxxxxx 

在你.env文件,以使其发挥作用。

编辑:

从我从你的链接阅读,这只是一个普通的Linux shell环境变量。但Django需要在设置中将SECRET_KEY作为python常数。 Linux环境变量和python变量是两个不同的东西,因此定义env变量SECRET_KEY不会让django识别settings.SECRET_KEY。您仍然应该考虑使用单独的设置文件,这是大多数建议的。

+0

我一直在关注heroku的django部署指南,他们正在使用一个env文件来做这件事,这个例子有点不完整,这是我卡住的地方。另外,我认为它的清洁程序可以保持1个设置文件,即使它们都是从相同的base_settings继承所有常用设置。使用导出工作,但现在我比我开始时更困惑,因为你认为这不是好的做法。 – alexolivas

+0

哦,我对Herku还不够了解,也许我错了。我会删除我对设置文件的建议,因为heroku可能有一些技巧使它可以在'.env'文件中使用。但我认为你应该明白为什么你需要'出口'。如果你仍然想使用多个设置文件,请检查:http://stackoverflow.com/questions/24071489/django-using-multiple-settings-files-with-heroku –

+0

顺便说一句,我仍然感兴趣在哪里你找到指导了。 –