如何在烧瓶中使用工厂模式时在烧瓶扩展中使用配置?

时间:2016-08-17 14:39:40

标签: python flask

我在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")

2 个答案:

答案 0 :(得分:2)

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

您可以使用以下命令在create_app函数中实例化Admin对象:

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)

答案 1 :(得分:1)

您需要做的就是设置如下。

# 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

只要您运行开发服务器,就不应该有问题将其保留在应用程序的上下文中。