Я создаю многоязычное приложение, используя Flask, а также использую Flask-Login для аутентификации.
Мои типичные взгляды выглядят так:
@auth.route('/en/login/', endpoint="login_en", methods=['GET', 'POST'])
@auth.route('/es/login/', endpoint="login_es", methods=['GET', 'POST'])
def login():
...
Пока я имею дело с языковыми предпочтениями следующим образом:
@babel.localeselector
def get_locale():
"""Get user language."""
if 'static' not in request.path:
languages = app.config.get('LANGUAGES').keys()
lang = request.path.rstrip('/').split('/')[-1]
if lang in languages:
return lang
elif request.accept_languages:
return request.accept_languages.best_match(languages)
else:
return 'en'
@app.before_request
def before_request():
"""Store data in session before each request."""
...
g.language = get_locale()
Теперь Flask-Login требует маршрут входа по умолчанию, который обычно устанавливается следующим образом:
login_manager.login_view = "auth.login"
Я могу установить для этого языковой маршрут по умолчанию (например, auth.login_en
), но в идеале я хотел бы заранее обработать языковые предпочтения, чтобы пользователь получал наиболее подходящее представление входа в систему. Я подумал о фиктивном представлении:
@auth.route('/_login/', methods=['GET'])
def _login():
return redirect(url_for('auth.login_' + g.language), code=302)
.. который определяет предпочтение языка, а затем перенаправляет на правильное языковое представление, но это кажется немного неуклюжим.