我有一个cookiecutter Flask应用。我试图修改package.json,以便命令npm start
使用Python脚本设置一些环境变量。
现在我的Python脚本似乎运行正常,但是当package.json执行启动Flask的脚本时,未设置环境变量。
我可以开始阐明可能引起问题的原因。我的Python脚本可能在与Flask不同的进程中运行,并且正在自己的进程中设置环境变量,但是Flask无法访问它们。我需要做某种类似的方式来采购.bashrc。但是我不知道那是什么。也许问题是完全不同的!
这是我的package.json
的一大部分:
"scripts": {
"build": "NODE_ENV=production webpack --progress --colors -p",
"start": "npm run set-trusted-vars-no-force && npm run start-servers",
"start-local": "npm run set-local-vars && npm start",
"start-servers": "concurrently -n \"WEBPACK,FLASK\" -c \"bgBlue.bold,bgMagenta.bold\" \"npm run webpack-dev-server\" \"npm run flask-server\"",
"webpack-dev-server": "NODE_ENV=debug webpack-dev-server --port 8081 --hot --inline $PUBLIC",
"flask-server": "flask run",
"lint": "eslint \"assets/js/*.js\"",
"set-trusted-vars": "python ../config/set_env_vars.py --reset T --env trusted --credentials ../config/credentials/secrets.yml --config ../config/config.yml",
"set-trusted-vars-no-force": "python ../config/set_dev_env_vars.py --env trusted --credentials ../config/credentials/secrets.yml --config ../config/config.yml",
"set-local-vars": "python ../config/set_dev_env_vars.py --reset T'",
"set-local-vars-no-force": "python ../config/set_dev_env_vars.py"
}
这里是set_dev_env_vars.py
的一小部分相关内容:
def set_config(config_path, config_name):
with open(config_path) as file:
configs = yaml.safe_load(file)
config = configs[config_name]
for var in config:
os.environ[var] = str(config[var])
print(var, os.environ[var])
打印内容如下:
ENV local
FLASK_APP autoapp.py
FLASK_ENV development
SECRET_KEY not-so-secret
FLASK_RUN_PORT 8000
FLASK_RUN_HOST 0.0.0.0
烧瓶最终抱怨:
[FLASK] Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
[FLASK] npm ERR! code ELIFECYCLE
[FLASK] npm ERR! errno 2
[FLASK] npm ERR! cookiecutter_mbam@1.0.0 flask-server: `flask run`
[FLASK] npm ERR! Exit status 2
设置环境变量以便Flask可以找到它们的正确方法是什么?
p.s。我知道在没有其他上下文的情况下,这似乎是设置环境变量的过度设计的解决方案,但是我还要处理在这里不可见的更复杂的情况。
答案 0 :(得分:1)
我的Python脚本可能在与Flask不同的进程中运行,并且正在自己的进程中设置环境变量,但是Flask无法访问它们。
使用os.environ['FOO']='bar'
设置环境变量将在进程或其子进程(see this answer)的持续时间内进行设置。
Other threads不鼓励尝试使用Python在一些骇人听闻的解决方案中全局设置它们。
不仅如此,而且如果set_dev_env_vars.py
确实全局设置了环境变量,这会将前端与Flask服务器绑定到同一台计算机上。分离这两个是标准程序。我很好奇您是否有理由从前端启动后端服务器?这是flask-cookiecutter的行为还是您自己实施(或坚持使用)的东西?
大概config.yml
也包含前端配置。也许您应该从那里分离出Flask相关的配置值,并将其写入.env
文件,然后使用python-dotenv
将它们加载到Flask应用程序中。您甚至可以使用dot-env
(javascript)使前端加载其配置。
通过这种分离,您只需简单地确保所需的.env
文件可用于相应的服务器,即可将前端与后端分开部署。