15

我正在使用 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)。

4

4 回答 4

36

这里的其他答案侧重于更改您的模板以允许将所有 Flash 消息标记为安全,这可能不是您想要的。

如果您只想将某些闪烁的消息标记为安全,请将传递给 flash() 的文本包装在 Markup() 中。(用于标记的 Flask API 文档

例如,而不是:

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>'))

与往常一样,您需要从烧瓶包中导入标记,例如:

from flask import Markup
于 2015-04-22T19:37:07.093 回答
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 %}

在您的视图代码中,我会render_template在 flash() 调用之后添加一个。就像是:

flash('success')
return render_template('whatever.html')   
于 2014-01-21T17:00:10.033 回答
2

转义 HTML 是默认行为,因此将其传递给safe过滤器以显示未转义的 HTML:

{{ message|safe }}
于 2014-01-21T03:45:15.147 回答
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 ##
    )

然后在模板中,我在 if 中添加了一个额外的 if 语句get_flashed_messages()

{% 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 %}
于 2015-04-11T13:16:38.107 回答