73

在烧瓶中,我可以这样做:

render_template("foo.html", messages={'main':'hello'})

如果 foo.html 包含{{ messages['main'] }},页面将显示hello。但是如果有一条通往 foo 的路线怎么办:

@app.route("/foo")
def do_foo():
    # do some logic here
    return render_template("foo.html")

在这种情况下,如果我希望这种逻辑发生,那么访问 foo.html 的唯一方法是通过redirect

@app.route("/baz")
def do_baz():
    if some_condition:
        return render_template("baz.html")
    else:
        return redirect("/foo", messages={"main":"Condition failed on page baz"}) 
        # above produces TypeError: redirect() got an unexpected keyword argument 'messages'

那么,我怎样才能将该messages变量传递给foo路由,这样我就不必在加载之前重写该路由计算的相同逻辑代码?

4

4 回答 4

112

您可以将消息作为显式 URL 参数(经过适当编码)传递,或者在重定向之前将消息存储到session(cookie) 变量中,然后在呈现模板之前获取该变量。例如:

from flask import session, url_for

def do_baz():
    messages = json.dumps({"main":"Condition failed on page baz"})
    session['messages'] = messages
    return redirect(url_for('.do_foo', messages=messages))

@app.route('/foo')
def do_foo():
    messages = request.args['messages']  # counterpart for url_for()
    messages = session['messages']       # counterpart for session
    return render_template("foo.html", messages=json.loads(messages))

(可能不需要对会话变量进行编码,flask 可能会为您处理它,但不记得细节了)

或者,如果您只需要显示简单的消息,您可能只使用Flask Message Flashing 。

于 2013-06-12T08:32:54.793 回答
13

我发现这里的答案都不适用于我的特定用例,所以我想我会分享我的解决方案。

我正在寻找使用任何可能的 URL 参数将未经身份验证的用户重定向到应用程序页面的公共版本。例子:

/ app /4903294/my-great-car?email=coolguy%40gmail.com 到

/公共/4903294/my-great-car?email=coolguy%40gmail.com

这是对我有用的解决方案。

return redirect(url_for('app.vehicle', vid=vid, year_make_model=year_make_model, **request.args))

希望这对某人有帮助!

于 2019-01-13T06:50:49.830 回答
2

我有点困惑。“foo.html”只是您的模板的名称。路由名称“foo”和模板名称“foo.html”之间没有内在关系。

为了实现不为两个不同的路由重写逻辑代码的目标,我只需定义一个函数并为这两个路由调用它。我不会使用重定向,因为这实际上会重定向客户端/浏览器,这需要它们加载两个页面而不是一个页面,只是为了节省一些编码时间 - 这似乎意味着:-P

所以也许:

def super_cool_logic():
    # execute common code here

@app.route("/foo")
def do_foo():
    # do some logic here
    super_cool_logic()
    return render_template("foo.html")

@app.route("/baz")
def do_baz():
    if some_condition:
        return render_template("baz.html")
    else:
        super_cool_logic()
        return render_template("foo.html", messages={"main":"Condition failed on page baz"})

我觉得我错过了一些东西,并且有更好的方法来实现你想要做的事情(我不太确定你想要做什么)

于 2013-06-13T10:16:26.997 回答
-2

但是,您可以维护您的代码并简单地传递其中的变量,用逗号分隔:如果您要传递参数,您应该使用render_template

@app.route("/baz")
def do_baz():
    if some_condition:
        return render_template("baz.html")
    else:
        return render_template("/foo", messages={"main":"Condition failed on page baz"}) 
于 2021-08-12T09:45:15.807 回答