Flask-Babel生产环境语言切换异常问题及解决方法
Flask-Babel语言切换在负载均衡生产环境异常的问题与解决
我开发了一个基于Flask-Babel实现多语言翻译的Flask应用,本地环境运行完全正常,但部署到带负载均衡的AWS EC2 Ubuntu生产环境后,语言切换功能出现异常:
- 访问
https://my_url.com/fr/这类带语言前缀的URL时,页面显示错误的语言(例如显示德语或英语,而非预期的法语) - 有时无需操作语言选择器,仅刷新页面就会变更显示语言;有时使用语言选择器切换语言,却完全无法生效
编辑说明:通过在before_request装饰器中添加refresh()方法,已解决该问题(修改内容详见下文)
init.py
def create_app(): app = Flask(__name__) app.config.from_object(os.environ.get("FLASK_CONFIG")) app.app_context().push() Session(app) def get_locale(): if not g.get('lang_code', None): g.lang_code = request.accept_languages.best_match( app.config["LANGUAGES"], default="de") return g.lang_code babel = Babel(app) babel.init_app(app, locale_selector=get_locale) from app.webpage import webpage as webpage_blueprint with app.app_context(): app.register_blueprint(webpage_blueprint) @app.route("/") def home(): if not g.get('lang_code', None): get_locale() return redirect(url_for("webpage.main.index")) return app
routes.py
from flask import current_app, render_template, g, request, session from flask_babel import _, refresh from app.webpage.main import main @main.url_defaults def add_language_code(endpoint, values): if "lang_code" not in values: values.setdefault("lang_code", g.lang_code) @main.url_value_preprocessor def pull_lang_code(endpoint, values): g.lang_code = values.pop("lang_code", current_app.config["BABEL_DEFAULT_LOCALE"]) @main.before_request def before_request(): if g.lang_code not in current_app.config["LANGUAGES"]: g.lang_code = current_app.config["BABEL_DEFAULT_LOCALE"] if request.url_rule: dfl = request.url_rule.defaults or {} if "lang_code" in dfl and dfl["lang_code"] != g.lang_code: g.lang_code = current_app.config["BABEL_DEFAULT_LOCALE"] @main.route("/") def index(): return render_template("main/index.html") @main.route("/about") def about(): return render_template("main/about.html")
代码修改说明:
在before_request函数末尾添加refresh()方法,修改后的代码如下:
@main.before_request def before_request(): if g.lang_code not in current_app.config["LANGUAGES"]: g.lang_code = current_app.config["BABEL_DEFAULT_LOCALE"] if request.url_rule: dfl = request.url_rule.defaults or {} if "lang_code" in dfl and dfl["lang_code"] != g.lang_code: g.lang_code = current_app.config["BABEL_DEFAULT_LOCALE"] refresh()
内容的提问来源于stack exchange,提问作者lofi
相关产品推荐
相关产品推荐

