flask/gunicorn: установка переменной среды из переменной среды

В стеке python/flask/gunicorn/heroku мне нужно установить переменную среды на основе содержимого другой переменной env.

Для фона я запускаю приложение 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 запустит приложение.

Что я могу сделать, чтобы установить переменную среды в нужном месте?


person bebbi    schedule 22.10.2014    source источник


Ответы (3)


вы также можете установить переменные среды во время выполнения как таковые

gunicorn -b 0.0.0.0:5000 -e env_var1=enviroment1 -e env_var2=environment2
person Shankar ARUL    schedule 18.03.2016

Итак, ответ (через 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'

На всякий случай, если это поможет кому-то еще.

person bebbi    schedule 03.11.2014