在烧瓶中,我可以这样做:
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
路由,这样我就不必在加载之前重写该路由计算的相同逻辑代码?
答案 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))
希望这对某人有帮助!