2016-08-17 95 views
0

在Web应用程序的开发过程中,我使用工厂模式和瓶型扩展如flask-admin。我想在应用程序尚未创建时在flask-admin中加载一些配置。所以我使用current_app.config["SOME_CONFIG"]来获取配置值。但我得到了Working outside of application context.异常。代码如下:在烧瓶中使用工厂模式时如何在烧瓶扩展中使用配置?

# __init__.py 

from flask import Flask 

def create_app(config_name): 

    app = Flask(__name__) 
    app.config.from_object(config_name) 
    app.config.from_pyfile("config.py") 

    from admin import admin 
    admin.init_app(app) 

    return app 


# admin/__init__.py 

from flask import current_app 
from flask_admin import Admin 

admin = Admin(name=current_app.config["ADMIN_NAME"], template="bootstrap2") 
+0

这里不需要在每一个粘贴的行之间留出一个空格。你也有太多的4缩进的代码。哦...实际上,你也缩进了你可能想要的标题 –

+1

为什么管理员名称是配置的一部分?这似乎并不是它打算如何工作。 – davidism

+0

@davidism除了flask-admin之外,我还想根据配置在使用flask-security时定义模型的字段。例如,如果SECURITY_TRACKABLE为True,我将定义login_count,last_login_ip,last_login_at ... – stamaimer

回答

2

你的应用还处于安装状态create_app函数时(见http://flask.pocoo.org/docs/0.11/appcontext/)。在设置状态期间,您需要引用应用程序对象才能访问它,您不能使用current_app。

你可以使用实例化create_app函数内的管理对象:

admin = Admin(name=app.config["ADMIN_NAME"], template="bootstrap2")

OR

变化admin变量,并创建你的admin/__init__.py功能:

admin = object() 
def instantiate_admin(config): 
    global admin 
    admin = Admin(name=config["ADMIN_NAME"], template="bootstrap2") 
    return admin 

和在create_app()中使用它:

from admin import instantiate_admin 
admin = instantiate_admin(app.config) 
admin.init_app(app) 
0

所有你需要做的就是像下面这样设置它。

# config.py 
class Config(object): 
    ADMIN_NAME = 'admin' 

# __init__.py 
from flask import Flask 
from flask_admin import Admin 

# initiate all extensions here 
admin = Admin(template='bootstrap2') 

def create_app(config): 
    app = Flask(__name__) 
    app.config.from_object(config) 

    admin.init_app(app) 
    return app 

# wsgi.py 
from . import create_app 
from config import Config 

app = create_app(Config) 

if __name__ == '__main__': 
    app.run() 

而且在你管理软件包

# admin/__init__.py 
from .. import admin # import extensions from __init__.py 

admin.add_view('blah') 

下面是一个真实世界的例子的链接。我洗刷了信息,所以它更通用,但这是我如何设置我所有的烧瓶应用程序。

http://hastebin.com/likupoxoxi.py

只要你运行的是开发服务器,你不应该有保持它在应用程序的上下文的问题。