【问题标题】:flask/gunicorn: setting environment variable from environment variableflask/gunicorn:从环境变量设置环境变量
【发布时间】:2014-12-17 17:59:13
【问题描述】:

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

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

如何在需要的地方设置环境变量?

【问题讨论】:

    标签: heroku flask environment-variables gunicorn foreman


    【解决方案1】:

    好的,所以答案(通过 Kenneth R,Heroku)是在运行 gunicorn 之前设置环境。 IE。写一个类似的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'
    

    以防万一它可以帮助其他人。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        设置环境变量(key=value)。

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

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

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

        【讨论】:

        • 欢迎来到 SO。您能否说明这与@jetpackdata.com 解决方案有何不同?
        • 有点不同\n当你用.config启动gunicorn时,你可以使用我的答案
        猜你喜欢
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        • 2018-07-13
        • 2012-02-06
        • 1970-01-01
        • 2014-09-29
        • 1970-01-01
        相关资源
        最近更新 更多