Flask RestPlus:如何使用应用程序工厂模式访问配置文件?

问题描述 投票:0回答:1

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

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']
python api flask flask-restful flask-restplus
1个回答
0
投票

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

应用程序上下文跟踪应用程序级数据在请求期间,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

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()
© www.soinside.com 2019 - 2024. All rights reserved.