python - Flask虚拟环境和环境变量

标签 python flask gunicorn supervisord python-venv

要让supervisord下的gunicorn使用虚拟环境/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中初始化它们之后?

相关: 1 , 2 , 3 , 4 , 5 , 6 , 7

最佳答案

这是一个食谱:

将环境变量写入文件/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 聊天表明它可以处理逗号、引号、制表符,甚至换行符。从经验来看,这并不成立(至少对于 supervisord 3.3.5 而言),并且文档也没有以某种方式解决这个问题。两行942-943 似乎是parsing的地方如果有人愿意调查文档的不足,就会发生这种情况。

关于python - Flask虚拟环境和环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55437599/

相关文章:

python - 更改 Matplotlib 后端会使 Debug模式崩溃

python - sqlalchemy.exc.ProgrammingError : (psycopg2. 编程错误)关系 "story"不存在

python - 尝试从目录外部导入时出现 ModuleNotFoundError

django - gunicorn + redis : Does not work?

django - 在没有 virtualenv 的情况下配置 Gunicorn

django:nginx 静态内容不起作用

Python RAD(桌面部署)

python - 安装旧版本的 scikit-learn

python - 创建渐变图例 matplotlib

python - 错误: The function either returned None or ended without a return statement.但在哪里找不到?