【发布时间】:2021-03-17 14:03:57
【问题描述】:
我正在开发一个 Flask GAE 应用程序,并计划使用 flask-babel 支持多种语言。
我用两个字母的语言代码为所有路由路径添加前缀,并且我设置了重定向来强制执行它。假设英语是用户对我支持的语言的偏好,我将其设置为 / 重定向到 /en/,/about 重定向到 /en/about/,例如。
我的问题是,这会导致无效路由在 404 之前被重定向。例如,/dsdf 重定向到 /en/dsdf/,然后是 404s。我宁愿只使用没有重定向的纯 URL 404。我不知道如何检查缺少前缀的给定路径是否对应于有效路由(如果它有前缀)。
这是我的main.py 的最小代码示例。我能在网上找到的唯一信息是https://medium.com/@nicolas_84494/flask-create-a-multilingual-web-application-with-language-specific-urls-5d994344f5fd,但对我来说似乎并没有以同样的方式工作; request.url_rule.defaults 评估为 None。
from flask import Flask, g, request
from flask_babel import Babel
SUPPORTED_LANGUAGES = ['en', 'es', 'zh']
app = Flask(__name__)
babel = Babel(app)
@babel.localeselector
def get_locale():
if not g.get('lang', None) or g.lang not in SUPPORTED_LANGUAGES:
g.lang = request.accept_languages.best_match(SUPPORTED_LANGUAGES)
return g.lang
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
if values is None:
values = {}
g.lang = values.pop('lang', None)
@app.before_request
def before_request():
prefix = request.full_path.split('/')[1].rstrip('/ ?')
if prefix not in SUPPORTED_LANGUAGES:
# handle URLs that aren't properly prefixed with a langauge
return redirect('/' + get_locale() + request.full_path, 302)
@app.route('/<lang>/')
def index():
return 'Hello, world! ' + g.lang
@app.route('/<lang>/about/')
def about():
return 'About ' + g.lang
if __name__ == '__main__':
app.run(host='localhost', port=8080, debug=True)
【问题讨论】:
标签: python google-app-engine flask