【问题标题】:Flask - Redirect and passing arguments to the functionFlask - 重定向并将参数传递给函数
【发布时间】:2019-01-26 13:13:58
【问题描述】:

我正在我的应用程序中实现语言菜单。 主 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")

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

【问题讨论】:

    标签: python redirect flask arguments


    【解决方案1】:

    如果您只想使用新的language 设置提供相同的模板,那么知道home_page() 视图只是一个函数会有所帮助。你可以这样称呼它:

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

    更好的是,你可以在多个路由下注册视图,你实际上不需要这里的第二个函数;只需将/lang=&lt;language&gt; 注册移动到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(使用 30x Moved 响应),但同时保留语言设置,那么您将丢失您之前的信息存储在 URL 路径中,并且必须在其他地方记录语言偏好。大多数多语言网站通常将您的语言偏好存储在专用 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'))
    

    【讨论】:

    • 谢谢,但用户仍会在浏览器中看到 /lang=foo,因为他没有被重定向到 (/),而这正是我要避免的。
    • @YanivK.:对,你的问题并不清楚。如果不将该信息也存储在其他地方,您就无法做到这一点,例如在 cookie 中。
    • 好的,我必须了解它,因为它对我来说是新的,但听起来很有希望。谢谢!
    • 顺便说一下,乍一看似乎home_page() 总是会返回en,因为它是硬编码的。您确定它不应该是具有默认值的参数吗?
    • @YanivK。至于重定向/cookie 要求:您必须意识到 HTTP 协议是无状态。每个请求都应被视为来自随机客户端的新连接。 您需要了解的有关该客户端的所有信息都需要成为该请求的一部分。该请求有一个 URL,这是一条信息,但您可以使用标头来了解有关 cilent 的更多信息。 Cookie 是要求客户端将更多信息附加到其下一个请求的一种方式,如果您不希望 URL 中包含该语言,那么 Cookie 是放置相同信息的好地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多