如何传递给url_for默认参数?

时间:2015-11-18 14:49:31

标签: flask translation jinja2 babel url-for

我开发了多语言网站。 页面的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():
...

1 个答案:

答案 0 :(得分:4)

在构建网址时使用app.url_defaults提供默认值。使用app.url_value_preprocessor自动从网址中提取值。这在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/aboutg.lang_code会在访问网址时自动设置为RU。

Flask-Babel为处理语言提供了更强大的支持。