首页 > 解决方案 > Flask-Security,多语言页面的动态 url 前缀(使用 Flask-Babelex)

问题描述

我正在将 Flask-Babelex 添加到我的网站。我使用 url_prefix 注册蓝图,如下所示:

from app.main import bp as main_bp
    app.register_blueprint(main_bp, url_prefix="/<lang_code>")

我设置 babel.localeselector 如下:

@babel.localeselector
    def get_locale():
        if not g.get('lang_code', None):
            g.lang_code = request.accept_languages.best_match(app.config['LANGUAGES'])
        return g.lang_code

然后在相应蓝图的 routes.py 文件中添加:

@bp.url_defaults
def add_language_code(endpoint, values):
    values.setdefault('lang_code', g.lang_code)


@bp.url_value_preprocessor
def pull_lang_code(endpoint, values):
    g.lang_code = values.pop('lang_code')

基本上,我正在关注这里所做的事情,并且运行良好。我似乎无法实现的是强制 Flask-Security-Too 使用这个变量 url_prefix。

如果我不更改烧瓶安全配置中的任何内容并访问 localhost:5000/change_password 它会向我抛出“UnknownLocaleError: unknown locale 'change_password'”,这是可以理解的。如果我访问 localhost:5000/pl/change_password,我会得到“AttributeError: '_AppCtxGlobals' 对象没有属性 'lang_code'”。

现在我可以将 SECURITY_URL_PREFIX 配置参数设置为“/<lang_code>”,但随后我得到“AttributeError:'_AppCtxGlobals' 对象也没有属性'lang_code'”。

如何将 lang_code 的信息传递给 Flask-Security?

编辑:
配置:

SECURITY_PASSWORD_SALT = os.environ.get("SECURITY_PASSWORD_SALT")
SECURITY_REGISTERABLE = True
SECURITY_CONFIRMABLE = True
SECURITY_CONFIRM_REGISTER_FORM = ExtendedRegisterForm
SECURITY_TRACKABLE = True
SECURITY_CHANGEABLE = True
SECURITY_RECOVERABLE = True
SECURITY_CHANGE_URL = "/change_password"
SECURITY_POST_LOGIN_VIEW = "/dashboard"
SECURITY_POST_CONFIRM_VIEW = "/welcome"

版本:

标签: pythonflaskflask-securityflask-babel

解决方案


推荐阅读