【问题标题】:Access a Flask extension that is defined in the app factory访问在应用工厂中定义的 Flask 扩展
【发布时间】:2016-11-21 11:41:32
【问题描述】:

我正在使用应用工厂模式来设置我的 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 变量。我应该如何解决这个问题?

【问题讨论】:

    标签: python flask python-babel flask-babel


    【解决方案1】:

    Flask 扩展被设计为在没有应用实例的情况下被实例化。在工厂之外,定义你的扩展。在工厂内部,调用init_app将应用与扩展关联起来。

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

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


    您似乎已经使用db (Flask-SQLAlchemy) 扩展正确地做到了这一点。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多