Spa*_*ide 5 python babel flask
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我想将以下内容添加到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
Run Code Online (Sandbox Code Playgroud)
遗憾的是,main.py无法babel从应用程序工厂访问变量.我该如何解决这个问题?
Flask扩展旨在实例化,而不是针对这种情况的应用程序实例.在工厂外,定义您的扩展.在工厂内部,呼叫init_app将应用程序与扩展程序相关联.
babel = Babel()
def create_app():
...
babel.init_app(app)
...
Run Code Online (Sandbox Code Playgroud)
现在,该babel名称可以随时导入,而不仅仅是在创建应用程序之后.
您似乎已经使用db(Flask-SQLAlchemy)扩展正确地执行了此操作.
在您的具体babel.localeselector示例的情况下,将其放在旁边可能更有意义,babel因为它是在那里定义的.