#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, чтобы просмотреть их все.