访问应用工厂中定义的Flask扩展

时间:2016-07-18 18:45:58

标签: python flask babel

我正在使用app工厂模式来设置我的Flask应用程序。我的应用程序使用Flask-Babel扩展,也在工厂中设置。但是,我想在蓝图中访问扩展程序以便使用它,

工厂位于__init__.py

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

    babel = Babel(app)

    app.register_blueprint(main_blueprint)
    app.register_blueprint(category_blueprint)
    app.register_blueprint(item_blueprint)

    db.init_app(app)
    return app

我想将以下内容添加到main.py

@babel.localeselector
def get_locale():
    if 'locale' in session:
        return session['locale']
    return request.accept_languages.best_match(LANGUAGES.keys())

@application.route('/locale/<locale>/', methods=['GET'])
def set_locale(locale):
    session['locale'] = locale
    redirect_to = request.args.get('redirect_to', '/')
    return redirect(redirect_to)     # Change this to previous url

不幸的是,main.py无法访问应用工厂中的babel变量。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

Flask扩展程序旨在实例化,而不是针对这种情况的应用程序实例。在工厂外,定义您的扩展。在工厂内部,请致电init_app以将应用与扩展程序相关联。

babel = Babel()

def create_app():
    ...
    babel.init_app(app)
    ...

现在babel名称可以随时导入,而不仅仅是在创建应用程序之后。

您似乎已经使用db(Flask-SQLAlchemy)扩展程序正确执行此操作。

对于您的特定babel.localeselector示例,将其放在babel旁边可能更有意义,因为它已在那里定义。