2014-10-22 263 views
2

python/flask/gunicorn/heroku堆栈上,我需要根据另一个env变量的内容设置一个环境变量。烧瓶/ gunicorn:从环境变量设置环境变量

对于背景,我在heroku上运行python/Flask应用程序。 我通过一个包含凭据和url的环境变量与插件进行通信。 我用来与插件进行通信的库需要这些数据,但需要使用不同的格式。 此外,它需要它作为一个环境变量。

到目前为止,我手动克隆和重新格式化了环境变量,但这只是因为附加提供程序正在更改密码而带来了灾难。

好的,所以我需要在库开始查找之前自动读取一个环境变量并设置另一个环境变量。

简易方法我试过了(文件app.py):

app = Flask(__name__, ...) 
env_in = os.environ['ADDON_ENV_VAR'] 
os.environ['LIB_ENV_VAR'] = some_processing(env_in) 
... 
if __name__ == '__main__': 
    app.run(host='0.0.0.0', port='5000') 

,这样做python app.py进行调试时,工作正常,但在运行时通过gunicorn app:app -b '0.0.0.0:5000'部署一个真正的Web服务器失败(作为Procfileforeman) 。在第二种情况下,env var似乎没有达到操作系统级别。我不确定wsgi是如何工作的,但是一旦gunicorn开始运行应用程序,环境可能会发生变化。

我能做些什么来让环境变量设置在需要的地方?

回答

2

好的,所以答案(通过Kenneth R,Heroku)是在运行gunicorn之前设置环境。即写信Procfile像

web: sh appstarter.sh 

它调用一个包装(壳,蟒,..),设置了将环境变量,然后运行gunicorn命令,象例如

appstarter.sh:

export LIB_ENV_VAR=${ADDON_ENV_VAR}/some/additional_string 
gunicorn app:app -b '0.0.0.0:5000' 

以防万一它帮助其他人。

1

你也可以在运行时设置的环境变量,例如

gunicorn -b 0.0.0.0:5000 -e env_var1=enviroment1 -e env_var2=environment2