4

我已经将我的几个 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 键的常量),上述两种方法都应该有效,而且它们确实有效。任何不在应用程序中使用模型的上下文中使用的东西当然会出错,返回您需要的值的方法应该是好的。

4

2 回答 2

1

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

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'
于 2018-06-19T15:33:18.790 回答
0

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

一种选择是进行循环导入:

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

__init__.py

import flask

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

import models_package

模型包.py

from App import application
config = application.config

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

模型包.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(..) 
于 2013-04-18T01:09:27.043 回答