如何传递给 url_for 默认参数?
How to pass to url_for default params?
我开发多语言网站。
页面具有这样的 URI:
/RU/about
/EN/about
/IT/about
/JP/about
/EN/contacts
在 jinja2 模板中我写:
<a href="{{ url_for('about', lang_code=g.current_lang) }}">About</a>
我必须在所有 url_for
个调用中写 lang_code=g.current_lang。
是否可以将 lang_code=g.current_lang
隐式传递给 url_for
?并且只写 {{ url_for('about') }}
我的路由器看起来像:
@app.route('/<lang_code>/about/')
def about():
...
在构建 url 时使用 app.url_defaults
提供默认值。使用 app.url_value_preprocessor
自动从 url 中提取值。 the docs about url processors.
中对此进行了描述
@app.url_defaults
def add_language_code(endpoint, values):
if 'lang_code' in values:
# don't do anything if lang_code is set manually
return
# only add lang_code if url rule uses it
if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
# add lang_code from g.lang_code or default to RU
values['lang_code'] = getattr(g, 'lang_code', 'RU')
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
# set lang_code from url or default to RU
g.lang_code = values.pop('lang_code', 'RU')
现在 url_for('about')
将生成 /RU/about
,并且 g.lang_code
将在访问 url.
时自动设置为 RU
Flask-Babel 为处理语言提供更强大的支持。
我开发多语言网站。 页面具有这样的 URI:
/RU/about
/EN/about
/IT/about
/JP/about
/EN/contacts
在 jinja2 模板中我写:
<a href="{{ url_for('about', lang_code=g.current_lang) }}">About</a>
我必须在所有 url_for
个调用中写 lang_code=g.current_lang。
是否可以将 lang_code=g.current_lang
隐式传递给 url_for
?并且只写 {{ url_for('about') }}
我的路由器看起来像:
@app.route('/<lang_code>/about/')
def about():
...
在构建 url 时使用 app.url_defaults
提供默认值。使用 app.url_value_preprocessor
自动从 url 中提取值。 the docs about url processors.
@app.url_defaults
def add_language_code(endpoint, values):
if 'lang_code' in values:
# don't do anything if lang_code is set manually
return
# only add lang_code if url rule uses it
if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
# add lang_code from g.lang_code or default to RU
values['lang_code'] = getattr(g, 'lang_code', 'RU')
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
# set lang_code from url or default to RU
g.lang_code = values.pop('lang_code', 'RU')
现在 url_for('about')
将生成 /RU/about
,并且 g.lang_code
将在访问 url.
Flask-Babel 为处理语言提供更强大的支持。