Виртуальная среда Flask и переменные среды

Чтобы gunicorn под supervisord использовать виртуальную среду /home/ubuntu/venv/bin, не нужно искать подходящее место для размещения source /home/ubuntu/venv/bin/activate. Достаточно написать:

[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/hello/
environment=PATH="/home/ubuntu/venv/bin:%(ENV_PATH)"

in /usr/supervisor/hello.conf.

Следующая задача - ввести целый набор переменных среды. Один из способов - это кропотливо дополнить файл конфигурации supervisord следующим образом.

[program:hello]
...
environment=PATH="/home/ubuntu/venv/bin:%(ENV_PATH)",SECRET_KEY="%(ENV_SECRET_KEY)",DATABASE_URI="%(ENV_DATABASE_URI)",etc1,etc2,etc3

Есть ли способ ввести переменные среды одним выстрелом (после их инициализации, скажем, в ~/.profile?

По теме: 1, 2, 3, 4, 5, 6, 7


person Calaf    schedule 31.03.2019    source источник
comment
Если запустить gunicorn из командной строки, это сработает?   -  person SuperShoot    schedule 31.03.2019
comment
supervisord Наследует ли вашу среду при запуске или создает свою собственную? Ввод Venv просто устанавливает некоторые переменные среды, поэтому вам нужно убедиться, что они правильно установлены в среде supervisord.   -  person chepner    schedule 31.03.2019
comment
@SuperShoot А! хорошая точка зрения. Нет, это не так. Можете ли вы предложить еще один пример на пути к отладке этого?   -  person Calaf    schedule 31.03.2019
comment
@chepner Что вы подразумеваете под наследованием среды? Независимо от того, находится ли оболочка (bash) в venv или нет, она терпит неудачу. environment supervisord - это IIUC для переменных среды, а не для виртуальной среды Python.   -  person Calaf    schedule 31.03.2019
comment
Вход в виртуальную среду Python делает немного больше, чем просто добавляет соответствующий каталог в PATH в вашей среде. Если PATH supervisord не включает /home/ubuntu/venv/bin, то он не будет использовать правильный интерпретатор Python.   -  person chepner    schedule 31.03.2019
comment
@chepner Интересно ... значит, я могу заменить любую попытку source ..activate настройкой среды supervisord внутри блока [program:hello], не так ли? Это не помогает.   -  person Calaf    schedule 31.03.2019
comment
Что, если вы вернете os.environ['PATH'] из представления, чтобы его можно было осмотреть?   -  person SuperShoot    schedule 31.03.2019
comment
Я вижу, что этот метод (stackoverflow.com/a/1883251/704972) (который в остальном работает правильно) вводит в заблуждение в этом кейс. Если я возвращаю sys.version, я вижу, что я действительно нахожусь в виртуальной среде в этом игрушечном / приветственном приложении, но не в моем реальном приложении. Так что моя изоляция для этого вопроса не является полной.   -  person Calaf    schedule 31.03.2019
comment
@SuperShoot os.environ ['ПУТЬ'] показывает путь venv. Это хорошая отправная точка, чтобы увидеть, что происходит в большом приложении.   -  person Calaf    schedule 31.03.2019
comment
Не пользуйтесь супервизором? :)   -  person hd1    schedule 31.03.2019
comment
@ hd1 и вообще не использовать контроллер процесса? Если вы используете конкурента и вас устраивает (supervisord.org/glossary.html#term-daemontools), поделитесь, пожалуйста, своим опытом.   -  person Calaf    schedule 01.04.2019


Ответы (2)


Вот рецепт:

Запишите переменные среды в файл /home/ubuntu/prog/.env.

export FLASK_APP=/home/ubuntu/prog/hello.py
export SECRET_KEY=ABCD
export DATABASE_PASSWORD=EFGH

Используйте load_dotenv dotenv для загрузки переменных среды.

from flask import Flask
from os.path import join, dirname
from os import environ
from dotenv import load_dotenv

app = Flask(__name__)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

@app.route('/')
def hello():
    SECRET_KEY = environ.get("SECRET_KEY")
    DATABASE_PASSWORD = environ.get("DATABASE_PASSWORD")
    return SECRET_KEY + DATABASE_PASSWORD

Напишите файл /etc/supervisor/hello.conf.

[program:hello]
command=/home/ubuntu/venv/bin/gunicorn -b localhost:8000 hello:app
directory=/home/ubuntu/prog
stdout_logfile=/home/ubuntu/prog/hello_out.log
stderr_logfile=/home/ubuntu/prog/hello_err.log
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

[supervisord]
logfile=/home/ubuntu/prog/hello_supervisord.log
pidfile=/tmp/supervisord.pid

Загрузите среду и укажите на приложение.

source /home/ubuntu/prog/.env

Переменные среды загружены,

$ export | grep SECRET
declare -x SECRET_KEY="ABCD"

и они будут переданы подпроцессу, не вмешиваясь в supervisord environment=.

Запустите supervisord на переднем плане, чтобы убедиться, что все в порядке.

/usr/bin/supervisord -n -edebug -c /etc/supervisor/hello.conf

Подтвердите из другой оболочки, что все в порядке.

$ curl localhost:8000
ABCDEFGH

Убить supervisord. Поскольку он находится на переднем плане, достаточно его CTRL-c.

Запустить supervisord как демон.

/usr/bin/supervisord -c /etc/supervisor/hello.conf

Следите за тремя файлами журнала prog/hello_out.log, prog/hello_err.log и prog/hello_supervisord.log.

Возможно, самый важный момент - избегать использования supervisord environment=. SO-болтовня предполагает, что он обрабатывает запятые, кавычки, табуляции и даже символы новой строки. Эмпирически это не выполняется (по крайней мере, для supervisord 3.3.5), и документация не решает этого так или иначе. Две строчки 942-943 кажутся там, где если кто-то захочет исследовать недостаточность документации.

person Calaf    schedule 31.03.2019

Чтобы ввести переменные среды за один раз, надолго и надежно, вам нужно добавить следующие строки в .bashrc в каталоге $ HOME. Для этого откройте файл .bashrc в вашем домашнем каталоге с помощью вашего любимого редактора кода:

nano .bashrc

Добавьте следующую строку в ваш файл .bashrc:

export SECRET_KEY="YOUR SECRET KEY."

Теперь, чтобы использовать этот SECRET_KEY во флаконе, вам нужно импортировать модуль os и использовать его следующим образом.

from flask import Flask
import os

app = Flask(__name__)

@app.route('/')
def hello():
    SECRET_KEY = os.environ.get('SECRET_KEY')
    return SECRET_KEY 

Надеюсь это поможет.

person Naveen Kumar    schedule 11.11.2019