Flask-将参数重定向并传递给函数

时间:2019-01-26 13:13:59

标签: python redirect flask arguments

我正在将语言菜单实现到我的应用程序中。 主URL返回默认的英语页面,您可以从那里通过菜单选择其他语言。

这是代码:

@app.route('/')
def home_page(language='en'):
    return render_template(f"homepage - {language}.html")


@app.route('/lang=<language>')
def home_page_language(language):
    return render_template(f"homepage - {language}.html")

选择一种语言后,URL为foo.foo/lang=foo, 因此,我想知道是否有一种方法可以重定向到home_page函数,并同时传递语言参数,以使URL保持整洁(foo.foo

1 个答案:

答案 0 :(得分:1)

如果您要做的只是使用新的language设置提供相同的模板,那么有助于了解home_page()视图只是一个函数。您可以调用它:

@app.route('/lang=<language>')
def home_page_language(language):
    return home_page(language)

更好的是,您可以在多个路径下注册视图,这里实际上不需要第二个功能;只需将/lang=<language>注册移至home_page()函数:

@app.route('/')
@app.route('/lang=<language>')
def home_page(language='en'):
    return render_template(f"homepage - {language}.html")

现在/将使用'en',而/lang=foobar将使用language='foobar'调用相同的函数。

如果您希望将浏览器实际重定向/ URL(使用30倍移动响应),但同时保留语言设置,则会丢失您存储在网址路径中的信息,并且必须记录语言偏好其他地方。大多数多语言站点通常将您的语言首选项存储在专用Cookie中,但您也可以使用Flask session object(默认设置中也基于cookie)。

要重定向到其他URL,请使用flask.redirect() function,然后将cookie附加到生成的响应对象上(使用Response.set_cookie()

您的首页将需要在同一Cookie中查找语言设置,将成为URL的一部分;我在这里使用了专用的cookie来存储此信息:

from flask import redirect, request, url_for

@app.route('/')
def home_page():
    language = request.cookies.get('language', 'en')
    return render_template(f"homepage - {language}.html")

@app.route('/lang=<language>')
def home_page_language(language):
    redirected = redirect(url_for('home_page'))
    redirected.set_cookie('language', language)
    return redirected

如果要将这些信息存储在会话对象中,则不必手动更新重定向响应,Flask框架会为您透明地处理该问题:

from flask import session, redirect, url_for

@app.route('/')
def home_page():
    language = session.get('language', 'en')
    return render_template(f"homepage - {language}.html")

@app.route('/lang=<language>')
def home_page_language(language):
    session['language'] = language
    return redirect(url_for('home_page'))