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í.