首页 > 解决方案 > Flask:来自 .env & 的 app.config 设置。mod_wsgi 中的 flaskenv

问题描述

我花了很长时间试图弄清楚如何在 Google Cloud Platform 服务器的烧瓶后端设置 .env 和 .flaskenv 配置值。我正在使用 apache2、mod_wsgi、Flask、Python 3.6 和 SQLAlchemy。我的后端使用纯 Flask 在我的 Mac 上本地运行良好。

安装了 python-dotenv 后,运行 flask 命令将设置在文件 .env 和 .flaskenv 中定义的环境变量。但是,这不适用于 wsgi。来自 apache 的请求被重定向以执行我的 run.wsgi 文件。没有机制(我知道)来设置 .env 和 .flaskenv 中定义的环境变量。

如果应该使用测试或开发环境,最低要求是传递给应用程序信息。从那里我可以在init .py 中从一个对象填充 app.config 值。但是,能够以某种方式使用来自 .env 和 .flaskenv 的配置值会好得多。如果有人在这里有任何好主意,我将不胜感激 - 在 wsgi 环境中设置 app.config 值的最佳实践。

有两个帖子提出了同样的问题——他们确实没有解决这个挑战的最佳实践(我相信我不是唯一一个遇到困难的人):

为什么 Flask 不能从 Apache (mod_wsgi) 中看到我的环境变量?

Apache SetEnv 无法与 mod_wsgi 一起按预期工作

我的 run.wsgi:

import sys
sys.path.append("/var/www/contacts-api/venv/lib/python3.6/site-packages")
sys.path.insert(0,"/var/www/contacts-api/")
from contacts import create_app
app = create_app('settings.py')
app.run()

[3]:允许您使用预设方法配置应用程序。

from flask_appconfig import AppConfig
def create_app(configfile=None):
app = Flask('myapp')
AppConfig(app, configfile)
return app

create_app 返回的应用程序将按顺序:

从名为 myapp.default_config 的模块(如果存在)加载默认设置。(http://flask.pocoo.org/docs/config/#configuring-from-files中描述的方法)从配置文件中加载设置,该配置文件的名称在环境变量 MYAPP_CONFIG 中给出(参见 1. 中的链接)。直接从前缀为 MYAPP_ 的环境变量中加载 json 或字符串值,即设置 MYAPP_SQLALCHEMY_ECHO=true 将导致 SQLALCHEMY_ECHO 的设置为 True。通过将适当的选项传递给构造函数或 init_app(),可以更改或禁用任何这些行为。

[4]:使用“ENV-only” 如果你只想使用 Flask-AppConfig 的环境解析功能,则暴露相应的功能:

from flask_appconfig.heroku import from_heroku_envvars
from flask_appconfig.env import from_envvars
# from environment variables. note that you need to set the prefix, as
# no auto-detection can be done without an app object
from_envvars(app.config, prefix=app.name.upper() + '_')
# also possible: parse heroku configuration values
# any dict-like object will do as the first parameter
from_heroku_envvars(app.config)

标签: pythonflaskmod-wsgiwsgi

解决方案


我正在与同样的难题搏斗,想要使用我在开发时使用的同一个.env文件。我最终使用了python-dotenv,如下所示:docker-composeflask run

.env

DEBUG=True
APPLICATION_ROOT=${PWD}

config.py

import os

from dotenv import load_dotenv
load_dotenv()

class Config(object):
    SECRET_KEY = os.getenv('SECRET_KEY') or 'development-secret'
    DEBUG = os.getenv("DEBUG") or False
    APPLICATION_ROOT = os.getenv("APPLICATION_ROOT") or os.getcwd()

我还没有尝试过它,但我也可以结合这个解决方案尝试flask-env 。


推荐阅读