我正在使用Flask创建一个Web应用来处理GoogleOpenID,这些代码几乎已经完成,除了闪烁的消息包含一个链接:
@oid.after_login
def create_or_login(resp):
user = db_session.query(User).filter_by(email=resp.email).first()
if user is not None:
flash('Successfully signed in', 'success')
else:
user = User(nickname=resp.fullname, source=GOOGLE, email=resp.email)
db_session.add(user)
db_session.commit()
flash(flashing_message, 'success')
g.user = user
session['nickname'] = user.nickname
return redirect(oid.get_next_url())
当flashing_message如下所示时效果很好:'Successfully registered, please click here'
但是当flashing_message为'Successfully registered, please click <a href="/me" class="alert-link">here</a>'
时,它不起作用(不闪烁)而不会抛出任何错误。奇怪的是,flash()和return之间的句子也不起作用(没有设置session ['nickname]或g.user)。
答案 0 :(得分:25)
此处的其他答案主要集中在更改模板以允许将所有Flash消息标记为安全,这可能不是您想要的。
如果您只想将某些闪烁消息标记为安全,请在Markup()中将传递给flash()的文本换行。 (Flask API Docs for Markup)
例如,而不是:
flash('Successfully registered, please click <a href="/me" class="alert-link">here</a>')
将字符串包装在Markup()中,如下所示:
flash(Markup('Successfully registered, please click <a href="/me" class="alert-link">here</a>'))
与往常一样,您需要从烧瓶包中导入Markup,例如:
from flask import Markup
答案 1 :(得分:3)
您需要在调用flash()
后呈现模板,然后使用get_flashed_messages()
获取消息。
调用flash()后,您需要调整代码以调用模板。 flash将消息发送到下一个请求,该请求可以由模板提取。模板看起来像:
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message | safe }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
在您的视图代码中,我会在flash()调用后立即添加render_template
。类似的东西:
flash('success')
return render_template('whatever.html')
答案 2 :(得分:1)
转义HTML是默认行为,因此将其传递到safe
过滤器以显示未转义的HTML:
{{ message|safe }}
答案 3 :(得分:0)
我不确定它是否正确,但我解决这个问题的方法是在函数中声明另一个变量,该变量是一串HTML,然后通过render_template()
函数传递。
在模板中传递了safe
过滤器。
例如,(大致基于)您提供的代码:
@oid.after_login
def create_or_login(resp):
user = db_session.query(User).filter_by(email=resp.email).first()
if user is not None:
flash('Successfully signed in', 'success')
else:
user = User(nickname=resp.fullname, source=GOOGLE, email=resp.email)
db_session.add(user)
db_session.commit()
flash(flashing_message, 'success')
link = "<a href=\"some_link.html\">Link</a>" ## ADDED HTML WITH LINK ##
g.user = user
session['nickname'] = user.nickname
return render_template('some_layout.html',
link=link ## PASS THE LINK TO THE TEMPLATE ##
)
然后在模板中,我在get_flashed_messages()
if:
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
... Code that was already here ...
{% if link %} ## PASSED THE LINK TO THE TEMPLATE HERE ##
{{ link | safe }}
{% endif %}
{% endif %}
{% endwith %}