繁体   English   中英

Flask:app.config 设置 from.env &。 mod_wsgi 中的 flaskenv

[英]Flask: app.config settings from .env &. flaskenv in mod_wsgi

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

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

如果应该使用测试或开发环境,最低要求是传递给应用程序信息。 从那里我可以在init .py 中从 object 填充 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)

在阅读了有关此内容的更多信息并尝试了许多不同的事情之后。 我得出的结论是,使用 .env- 和 .flaskenv 文件配置 Flask 应用程序没有合理的方法。 我最终使用了配置处理中介绍的一种方法,该方法能够以合理的方式管理开发/测试/生产环境:

app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')

我的 run.wsgi(在谷歌云平台计算实例中使用):

import sys
import os
from contacts import create_app
sys.path.append("/var/www/myapp/venv/lib/python3.6/site-packages")
sys.path.insert(0,"/var/www/myapp/")
os.environ['SETTINGS_PLATFORM_SPECIFIC'] = "/path/settings_platform_specific.py"
os.environ['CONFIG_ENVIRONMENT'] = 'DevelopmentConfig'

app = create_app(')
app.run()

在我的 Mac 上本地使用 run.py(对于 flask 运行):

import os
from contacts import create_app
os.environ['SETTINGS_PLATFORM_SPECIFIC'] ="/path/settings_platform_specific.py"
os.environ['CONFIG_ENVIRONMENT'] = 'DevelopmentConfig'

if __name__ == '__main__':
    app = create_app()
    app.run()

用于应用程序创建init .py

def create_app():

    app = Flask(__name__, template_folder='templates')
    app.config.from_object(f'contacts.settings_common.{os.environ.get("CONFIG_ENVIRONMENT")}')
    app.config.from_envvar('SETTINGS_PLATFORM_SPECIFIC')

    db.init_app(app)
    babel.init_app(app)
    mail.init_app(app)
    bcrypt.init_app(app)
    app.register_blueprint(routes)
    create_db(app)

    return app

在这一点上,看起来这对我的目的来说很好。 最重要的是,我可以使用 git 轻松管理不同的环境并将后端服务部署到谷歌平台。

我正在努力解决同样的难题,想要使用与docker-compose一起使用的相同.env文件,同时使用flask run进行开发。 我最终使用了python-dotenv ,如下所示:

.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM