【问题标题】:Getting config variables outside of the application context在应用程序上下文之外获取配置变量
【发布时间】:2023-03-22 17:08:01
【问题描述】:

我已将我的几个 sqlalchemy 模型提取到一个单独的可安装包 (../lib/site-packages) 中,以便在多个应用程序中使用。所以我只需要:

from models_package import MyModel

来自任何需要访问这些模型的应用程序。

到目前为止一切都很好,除了我找不到令人满意的方法来获取某些模型使用的几个依赖于应用程序的配置变量,这些变量可能因应用程序而异。所以一些模型需要知道一些变量,我之前使用过它们所在的应用程序。

都没有

current_app.config['XYZ']

config = LocalProxy(lambda: current_app.config['XYZ'])

已经工作(outside of application context 错误)所以我现在被卡住了。也许这是代表我的糟糕的编程和/或设计,那么如何解决这个问题?一定有什么办法,但我还没有理会自己。

解决方案:

避免在模块加载时发生的设置项(例如包含 api 键的常量),上述两种方法都应该起作用,而且它们确实有效。任何不使用那些在应用程序中使用的模型当然会出错,返回您需要的值的方法应该是好的。

【问题讨论】:

  • 您是否尝试从您的models_package 导入应用程序对象(不是通过current_app 代理)?
  • models_package 是独立的,没有应用程序对象,模型从那里导入到应用程序中。
  • 有时循环导入可以解决问题。

标签: python configuration flask config


【解决方案1】:

如果您正在使用利用类和继承 as described here 的配置模式,您可以简单地导入配置类及其各自的属性并在任何您想要的地方访问它们:

class Config(object):
    IMPORT = 'ME'
    DEBUG = False
    TESTING = False
    DATABASE_URI = 'sqlite:///:memory:'

class ProductionConfig(Config):
    DATABASE_URI = 'mysql://user@localhost/foo'

class DevelopmentConfig(Config):
    DEBUG = True

class TestingConfig(Config):
    TESTING = True

现在,在您的foo.py

from config import Config

print(Config.IMPORT) # prints 'ME'

【讨论】:

  • 这种方法的问题是你仍然需要从应用程序中获取当前环境,这样你才能知道要使用哪个配置选项。
【解决方案2】:

好吧,因为current_app 可以在注册蓝图时成为您的烧瓶程序的代理,并且这是在运行时完成的,所以您不能在您的models_package 模块中使用它。 (应用尝试导入models_package,而models_package 需要应用的配置来初始化事物——因此导入失败)

一种选择是循环导入:

假设一切都在“应用”模块中:

__init__.py

import flask

application = flask.Flask(__name__)
application.config = #load configs

import models_package

models_package.py

from App import application
config = application.config

或创建您自己的 config 对象,但这会以某种方式使复杂性加倍:

models_package.py

import flask

config = flask.config.Config(defaults=flask.Flask.default_config)

#pick one of those and apply the same config initialization as you do in 
#your __init__.py
config.from_pyfile(..) #or
config.from_object(..) #or
config.from_envvar(..) 

【讨论】:

  • 一个问题是,除了一些配置变量之外,模型对应用程序一无所知。必须将应用程序导入模型会过度地将它们捆绑在一起,而打包它们的全部目的是将它们与应用程序分开,并且该解决方案可能太成功了。
猜你喜欢
  • 1970-01-01
  • 2017-03-17
  • 2015-08-31
  • 2018-12-10
  • 2016-03-11
  • 2015-10-05
  • 2016-07-12
  • 2018-09-02
  • 2011-10-31
相关资源
最近更新 更多