2014-10-22 305 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