flask / gunicorn:从环境变量设置环境变量

时间:2014-10-22 09:56:54

标签: heroku flask environment-variables gunicorn foreman

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

对于背景,我在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'(作为Procfile foreman)运行以部署真实网络服务器时失败。在第二种情况下,env var似乎没有达到操作系统级别。我不确定wsgi是如何工作的,但是一旦gunicorn开始运行应用程序,环境就会发生变化。

如何将环境变量设置在需要的位置?

3 个答案:

答案 0 :(得分:2)

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

这样的Procfile
web: sh appstarter.sh

调用一个包装器(shell,python,..)来设置环境变量,然后运行gunicorn命令,例如

appstarter.sh:

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

以防它帮助其他人。

答案 1 :(得分:2)

您也可以在运行时设置环境变量

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

答案 2 :(得分:0)

设置环境变量(键=值)。

将变量传递到执行环境。例如:

$ gunicorn -b 127.0.0.1:8000 --env FOO = 1测试:应用 并在应用程序中测试foo变量环境。

来自:http://docs.gunicorn.org/en/stable/settings.html