Flask-безопасность, динамический префикс URL для многоязычной страницы (с помощью Flask-Babelex)

#python #flask #flask-security #flask-babel

#python #flask #flask-безопасность #flask-babel

Вопрос:

Я добавляю 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
 

Затем в маршрутах.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.

Если я ничего не изменяю в конфигурации flask-security и получаю доступ к localhost:5000 / change_password, он выдает «UnknownLocaleError: unknown locale ‘change_password'» на меня, что вполне понятно. Если я обращаюсь к localhost: 5000 /pl / change_password, я получаю «Ошибка атрибута: объект ‘_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"
 

Версии:

  • Flask-BabelEx == 0.9.4
  • Flask-Security-Тоже ==3.4.5

Комментарии:

1. Нужна дополнительная информация — Flask-Security-Тоже не поддерживает Flask-Babel до (неизданного) 4.0.0 — и (я полагаю) не поддерживает оригинальный Flask-Security. Кроме того, — / change-password не является конечной точкой по умолчанию, поэтому вы также изменили ее.. Пожалуйста, предоставьте дополнительную информацию о версии и конфигурации. Спасибо.

2. Спасибо за обращение. Что касается Babel, я мысленно сократил его, назвав Babel, хотя на самом деле это Flask-BabelEx (я отредактировал сообщение для уточнения). Я добавил информацию о версии и соответствующую конфигурацию (честно говоря, ничего особенного не изменилось) в основном сообщении.

3. Другая мысль — flask-security создает свой собственный план (имя по умолчанию «security») Похоже, вы не добавили «url_defaults» и «url_processor» в этот проект. Вы могли бы использовать Flask .iter_blueprints, чтобы просмотреть их все.