2013-04-17 100 views
1

我已經將幾個我的sqlalchemy模型提取到單獨的可安裝軟件包(../lib/site-packages)中,以便跨越多個應用程序使用。從任何應用程序需要訪問這些模型在應用程序環境之外獲取配置變量

from models_package import MyModel 

:所以我只需要。

到目前爲止,一切正常,但我找不到一種令人滿意的方式來獲取由某些模型使用的多個應用程序相關配置變量,這些變量可能因應用程序而異。因此,一些模型需要注意一些變量,而以前我使用他們的應用程序。

無論

current_app.config['XYZ'] 

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

工作過(outside of application context錯誤),使我現在被卡住了。也許這是代表我的糟糕編程和/或設計,那麼如何澄清這一點?必須有某種方式,但我還沒有向自己推理。

SOLUTION:

避免對模塊加載(如含有一個API密鑰的常數)將發生的設定項目,上述兩種應該的工作,並且他們做。任何不在應用中使用模型的環境中使用這些東西當然是錯誤的,返回你需要的值的方法應該是好的。

+0

你嘗試只導入應用程序對象(不是'current_app'代理)從你的'models_package'? – thkang

+0

models_package是單獨的,並且沒有應用程序對象,從那裏的模型被導入到應用程序中。 – blueblank

+0

有時循環進口解決了一個問題。 – thkang

回答

0

好吧,因爲current_app可以是藍圖註冊時燒瓶程序的代理,並且在運行時完成,所以不能在models_package模塊中使用它。 (應用嘗試導入models_package,並models_package需要的應用程序的CONFIGS到initalize東西 - 從而導入失敗)

一個選項,也可以做圓形進口:

假設一切都在「應用程序」模塊:

__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(..) 
+0

一個問題是,除了一些配置變量外,這些模型還不瞭解應用程序。不得不將應用程序導入到模型中,這會將他們捆綁在一起,過分地包裝它們的目的是讓它們與應用程序分離,而且解決方案可能太成功了。 – blueblank

相關問題