Acceda a una extensión de Flask que se define en la fábrica de aplicaciones

Estoy usando el patrón de fábrica de la aplicación para configurar mi aplicación Flask. Mi aplicación utiliza la extensión Flask-Babel, y eso también se configura en la fábrica. Sin embargo, quiero acceder a la extensión en un plano para poder usarla,

La fábrica está en __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 

Quiero agregar lo siguiente a 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//', 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 

Desafortunadamente, main.py no tiene acceso a la variable babel desde la fábrica de aplicaciones. ¿Cómo debo solucionar esto?

Las extensiones de matraz están diseñadas para ser instanciadas sin una instancia de aplicación para este caso. Fuera de la fábrica, define tus extensiones. Dentro de la fábrica, llame a init_app para asociar la aplicación con la extensión.

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

Ahora el nombre de babel es importable en cualquier momento, no solo después de que se haya creado la aplicación.


Parece que ya estás haciendo esto correctamente con la extensión db (Flask-SQLAlchemy).


En el caso de su ejemplo específico de babel.localeselector , podría tener más sentido poner eso junto a babel ya que se está definiendo allí.