传递参数时重定向

时间:2013-06-12 03:21:25

标签: python flask

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

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 个答案:

答案 0 :(得分:59)

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

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 Message Flashing

答案 1 :(得分: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"})

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

答案 2 :(得分:1)

我想提一句,url_for必须先添加到烧瓶进口中才能使用!

我花了一个小时试图找出为什么它不起作用,因为没有人在几个网站中提到!!

url_for添加到这样的导入列表中:

from flask import Flask, render_template, request, redirect, session, url_for

答案 3 :(得分:0)

我发现这里没有答案适用于我的特定用例,因此我想我会分享我的解决方案。

我一直在试图将未经身份验证的用户重定向到带有任何可能的URL参数的应用程序页面的公共版本。示例:

/ 应用 /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))

希望这对某人有帮助!