python - 如何使用应用程序工厂模式访问 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']
解决方案
使用current_app
或g
只能在接收请求的上下文中访问应用程序,如文档中所述。
应用程序上下文在请求、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()
推荐阅读
- php - WordPress 条件后循环
- javascript - 在我的 html 页面上添加阅读更多内容会产生奇怪的行为
- javascript - Paypal 按钮返回“无法捕获订单”
- apache - 为什么 Apache 2.4 永久重定向(301)这个到非 www?
- terraform - 如何使用 template_file 从另一个 shell 执行 shell 脚本?
- python - 使用 Python 从 MySQL 中检索整数以执行数学函数
- angular - Angular 5 - dist 文件夹中缺少配置文件
- javascript - 官方 React 教程,使用 Hooks:为什么会有额外的重新渲染?
- halide - 卤化物可以与 SOC 平台一起使用吗?
- amazon-ec2 - 无法访问 EC2 实例上托管的简单节点 Web 服务器