【问题标题】:Flask virtual environment and environment variablesFlask 虚拟环境和环境变量
【发布时间】:2019-08-21 14:02:43
【问题描述】:

要让gunicornsupervisord 下使用虚拟 环境/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

【问题讨论】:

  • 如果你在命令行启动 gunicorn,它会起作用吗?
  • supervisord 在启动时是继承您的环境,还是创建自己的环境?进入venv只是设置了一些环境变量,所以需要确保在supervisord的环境中正确设置。
  • @SuperShoot 啊!好点子。不,它没有。您能否在调试此问题的道路上提出另一条线索?
  • @chepner “继承环境”是什么意思?无论 (bash) shell 是否在 venv 中,它都会失败。 supervisordenvironment 是 IIUC,用于环境变量,而不是用于 Python 虚拟环境。
  • 进入 Python 虚拟环境只不过是在您的环境中将适当的目录添加到 PATH。如果supervisordPATH 不包含/home/ubuntu/venv/bin,则它不会使用正确的Python 解释器。

标签: python flask gunicorn supervisord python-venv


【解决方案1】:

这是一个食谱:

将环境变量写入文件/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 发生的地方。

【讨论】:

    【解决方案2】:

    要一次性、永久、安全地引入环境变量,您必须在 $HOME 目录中的 .bashrc 中添加以下行。 为此,使用您喜欢的代码编辑器打开主目录中的 .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 
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 2019-12-26
      • 2021-07-18
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 2018-03-23
      相关资源
      最近更新 更多