我正在使用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)
..决定了语言偏好,然后重定向到正确的语言视图,但这似乎有点笨拙。