首页 > 解决方案 > 如何使用应用程序工厂模式访问 Flask 配置文件?

问题描述

在应用程序蓝图中设置正确的环境后,我对如何访问配置文件感到非常困惑。我收到此错误:

RuntimeError: Working outside of application context.

这是我的配置文件:

import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = os.getenv('SECRET_KEY', 'admin123!')
    DEBUG = False

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
    MLFLOW_TRACKING_URI = <url>
    GOOGLE_APPLICATION_CREDENTIALS = 'daodl_access.json'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class TestingConfig(Config):
    DEBUG = True
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
    MLFLOW_TRACKING_URI = <url>
    GOOGLE_APPLICATION_CREDENTIALS = 'daodl_access.json'
    PRESERVE_CONTEXT_ON_EXCEPTION = False
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class ProductionConfig(Config):
    DEBUG = False
    is_prod = os.environ.get('DB_NAME')
    if is_prod:
        SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://{user}:{password}@{localhost}/{database}'.format(
            user=os.environ['DB_USER'], password=os.environ['DB_PASS'],
            localhost='127.0.0.1:5432', database=os.environ['DB_NAME'])

    else:
        SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
    MLFLOW_TRACKING_URI = <url>
    GOOGLE_APPLICATION_CREDENTIALS = 'prod_key.json'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

config_by_name = dict(
    dev=DevelopmentConfig,
    test=TestingConfig,
    prod=ProductionConfig
)

key = Config.SECRET_KEY

在一个单独的python文件中,我想检索与我在创建应用程序时设置的指定环境相对应的配置选项

from flask import current_app
mlflow_tracking_uri = current_app.config['MLFLOW_TRACKING_URI']
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = current_app.config['GOOGLE_APPLICATION_CREDENTIALS']

标签: pythonflask

解决方案


使用current_appg只能在接收请求的上下文中访问应用程序,如文档中所述。

应用程序上下文在请求、CLI 命令或其他活动期间跟踪应用程序级数据。不是将应用程序传递给每个函数,而是访问 current_app 和 g 代理。

由于您正在设置 os 环境变量,因此您可以在设置应用程序期间执行此操作。像这样:

import os

from flask import Flask

from .config import config_by_name


def new_app():
    env = os.getenv("ENV", "prod")
    config = config_by_name[env]

    app = Flask(__name__)
    app.config.from_object(config)

    setup_gcp_vars(app)
    return app

# You may also have this function in a
# separate module, then import it into
# the module that sets up your flask app
def setup_gcp_vars(app):
    os.environ["APP_ENV"] = app.config["OS_ENV"]
    mlflow_tracking_uri = app.config['MLFLOW_TRACKING_URI']


app = new_app()


if __name__ == "__main__":
    app.run()

推荐阅读