Flask虚拟环境和环境变量

问题描述 投票:0回答:1

要获得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)"

/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

相关:1234567

python flask gunicorn supervisord python-venv
1个回答
0
投票

这是一个食谱:

将环境变量写入文件/home/ubuntu/prog/.env

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

使用dotenvload_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"

他们将被传递到子过程而不会弄乱supervisordenvironment=

在前台启动supervisord以确认一切顺利。

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

从另一个shell确认一切正常。

$ curl localhost:8000
ABCDEFGH

杀死supervisord。因为它在前景中,所以它足以CTRL-c它。

启动supervisord作为守护进程。

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

密切关注三个日志文件prog/hello_out.logprog/hello_err.logprog/hello_supervisord.log

也许最重要的一点是避免使用supervisordenvironment=。 SO chatter建议它处理逗号,引号,标签,甚至新行。根据经验,这不成立(至少对于supervisord 3.3.5),并且文档不会以某种方式解决它。 942-943这两行似乎是parsing发生的地方,如果有人关心调查文档的不足。

© www.soinside.com 2019 - 2024. All rights reserved.