2016-08-17 41 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

只要你運行的是開發服務器,你不應該有保持它在應用程序的上下文的問題。