Flask虚拟环境和环境变量
Flask virtual environment and environment variables
要在 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
?
这是一个食谱:
将环境变量写入文件/home/ubuntu/prog/.env
。
export FLASK_APP=/home/ubuntu/prog/hello.py
export SECRET_KEY=ABCD
export DATABASE_PASSWORD=EFGH
使用dotenv
的load_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
从另一个 shell 确认一切正常。
$ 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 chatter 建议它处理逗号、引号、制表符,甚至换行符。根据经验,这不成立(至少对于 supervisord
3.3.5),并且文档没有以这种或那种方式解决它。这两行 942-943
似乎是 parsing 发生的地方,如果有人关心调查文档的不足。
要一次性、永久、安全地引入环境变量,您必须将以下行添加到 $HOME 目录中的 .bashrc。
为此,使用您喜欢的代码编辑器打开主目录中的 .bashrc 文件:
nano .bashrc
在您的 .bashrc 文件的某处添加以下行:
export SECRET_KEY="YOUR SECRET KEY."
现在要在 Flask 中使用此 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
希望这对您有所帮助。
要在 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
?
这是一个食谱:
将环境变量写入文件/home/ubuntu/prog/.env
。
export FLASK_APP=/home/ubuntu/prog/hello.py
export SECRET_KEY=ABCD
export DATABASE_PASSWORD=EFGH
使用dotenv
的load_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
从另一个 shell 确认一切正常。
$ 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 chatter 建议它处理逗号、引号、制表符,甚至换行符。根据经验,这不成立(至少对于 supervisord
3.3.5),并且文档没有以这种或那种方式解决它。这两行 942-943
似乎是 parsing 发生的地方,如果有人关心调查文档的不足。
要一次性、永久、安全地引入环境变量,您必须将以下行添加到 $HOME 目录中的 .bashrc。 为此,使用您喜欢的代码编辑器打开主目录中的 .bashrc 文件:
nano .bashrc
在您的 .bashrc 文件的某处添加以下行:
export SECRET_KEY="YOUR SECRET KEY."
现在要在 Flask 中使用此 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
希望这对您有所帮助。