当在flask中使用工厂模式时,如何在flask扩展中使用config



在web应用程序的开发过程中,我使用工厂模式和flask扩展,如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")

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

你可以在create_app函数中实例化Admin对象:

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

更改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)

您需要做的就是像下面这样设置它。

# 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包

# admin/__init__.py
from .. import admin # import extensions from __init__.py
admin.add_view('blah')

下面是一个现实世界的例子链接。我擦去了info,所以它更通用,但这就是我如何设置我所有的flask应用程序。

http://hastebin.com/likupoxoxi.py

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

最新更新