在应用程序上下文之外获取配置变量

时间:2013-04-17 22:51:34

标签: python configuration flask config

我已将几个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键的常量),上述都应工作,并且它们可以。任何不在应用程序模型的上下文中使用的东西当然都会出错,返回所需值的方法应该是好的。

2 个答案:

答案 0 :(得分:0)

好吧,因为current_app可以在注册蓝图时代表您的烧瓶程序,并且在运行时完成,您不能在models_package模块中使用它。 (app尝试导入models_packagemodels_package需要应用程序的配置才能初始化 - 因此导入失败)

一种选择是进行循环进口:

假设所有内容都在“App”模块中:

<强> __初始化__。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(..) 

答案 1 :(得分:0)

如果您正在使用利用类和继承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'