访问应用工厂中定义的 Flask 扩展
Access a Flask extension that is defined in the app factory
我正在使用应用工厂模式来设置我的 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
变量。我应该如何解决这个问题?
对于这种情况,Flask 扩展旨在在没有应用程序实例的情况下进行实例化。在工厂之外,定义您的扩展。在工厂内,调用 init_app
将应用程序与扩展相关联。
babel = Babel()
def create_app():
...
babel.init_app(app)
...
现在 babel
名称可以随时导入,而不仅仅是在创建应用程序之后。
您似乎已经使用 db
(Flask-SQLAlchemy) 扩展正确执行此操作。
在您的特定 babel.localeselector
示例中,将它放在 babel
旁边可能更有意义,因为它是在那里定义的。
我正在使用应用工厂模式来设置我的 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
变量。我应该如何解决这个问题?
对于这种情况,Flask 扩展旨在在没有应用程序实例的情况下进行实例化。在工厂之外,定义您的扩展。在工厂内,调用 init_app
将应用程序与扩展相关联。
babel = Babel()
def create_app():
...
babel.init_app(app)
...
现在 babel
名称可以随时导入,而不仅仅是在创建应用程序之后。
您似乎已经使用 db
(Flask-SQLAlchemy) 扩展正确执行此操作。
在您的特定 babel.localeselector
示例中,将它放在 babel
旁边可能更有意义,因为它是在那里定义的。