You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:13:23