如何使用Blask Flash闪烁链接闪烁消息?

发布于 2025-02-06 13:25:53 字数 839 浏览 4 评论 0原文

我正在使用Blask创建一个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这样的情况下,它可以很好地工作:'成功注册,请单击此处'

但是,当flashing_message被'成功注册时,请单击< a href =“/me” class =“ armer-link”> tery</a>',它不起作用(什么都没有),而不会丢任何错误。奇怪的是,flash()和返回之间的句子都无法正常工作(未设置会话['nickname]或g.user)。

I'm creating a web app using Flask to deal with GoogleOpenID, these codes are almost finished, except the flashing message contains a link:

@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())

It works well when flashing_message is like this: 'Successfully registered, please click here'

But when flashing_message is 'Successfully registered, please click <a href="/me" class="alert-link">here</a>', it doesn't work (flashes nothing) without throwing any Error. Strangely, sentences between flash() and return doesn't work either (did not set session['nickname] or g.user).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

嗼ふ静 2025-02-13 13:25:53

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

如果您只想将某些闪烁的消息标记为安全,请将传递给flash()的文本包裹在Markup()中。 (“ noreferrer”> for blask api docs for markup

flash('Successfully registered, please click <a href="/me" class="alert-link">here</a>')

)像这样的标记()中的字符串:

flash(Markup('Successfully registered, please click <a href="/me" class="alert-link">here</a>'))

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

from flask import Markup

The other answers here focus on changing your template to allow all flash messages to be marked as safe, which may not be what you want.

If you just want to mark certain flashed messages as safe, wrap the text passed to flash() in Markup(). (Flask API Docs for Markup)

For example, instead of:

flash('Successfully registered, please click <a href="/me" class="alert-link">here</a>')

Wrap the string in Markup() like this:

flash(Markup('Successfully registered, please click <a href="/me" class="alert-link">here</a>'))

As always, you will need to import Markup from the flask package something like:

from flask import Markup
伴我心暖 2025-02-13 13:25:53

您需要在调用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')   

You need to render a template after calling flash() which should then get the message using get_flashed_messages().
You need to adjust your code to call a template after calling flash(). flash sends the message to next request which can be extracted by the template. The template can look something like:

{% with messages = get_flashed_messages() %}
    {% if messages %}
    <ul class=flashes>
    {% for message in messages %}
        <li>{{ message | safe }}</li>
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}

In your view code, I would add a render_template right after the flash() call. Something like:

flash('success')
return render_template('whatever.html')   
心如狂蝶 2025-02-13 13:25:53

逃脱的HTML是默认行为,因此将其通过safe过滤器以显示HTML未播放:

{{ message|safe }}

Escaping HTML is the default behavior, so pass it through the safe filter to display the HTML unescaped:

{{ message|safe }}
执着的年纪 2025-02-13 13:25:53

我不确定它是否正确,但是我解决的方法是通过声明函数中的另一个变量,该变量是HTML的字符串,然后通过render_template()函数将其传递。

在模板中,它通过安全过滤器传递。

例如,(大致基于)您提供的代码:

@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 %}

I am not sure if it is correct, but the way I solved this was by declaring another variable in the function that was a string of HTML and then passing it through a render_template() function.

And in the template passed it through the safe filter.

For example, (roughly based on) the code you have provided:

@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 ##
    )

Then in the template I added an extra if statement inside the 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 %}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文