所有端点上的Flask flash消息

2024-04-18 17:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的Flask应用程序中,我通过flask.session完成了用户管理。因此,有关登录用户的所有信息都存储在session中。当一些新用户注册时,我在数据库中创建新行,其中一个属性verified设置为false,相同的信息存储在session['user']['verified']中。当用户浏览网站时,无论哪个端点,我都想给他发一条消息,说明他仍然没有验证他的电子邮件地址

到目前为止,我通过创建@after_request方法做到了这一点,如下所示:

@app.after_request
def check_user_verification_status(response):
    try:
        if not session['user']['verified']:
            flash("Your email address is still not verified, ...")
    except Exception:
        pass
    return response

这样,flash消息确实会出现在所有端点上,但有时会因为进行了一些重定向而出现重复。我按照以下答案解决了重复问题: Flask - duplicates flash messages

但是,当我在主页上并单击注销按钮时,它会重定向到endpointlogout(endpoint注销用户-从会话中删除用户信息-并重定向到主页),即使没有用户技术上登录,也会出现关于未验证用户的闪现消息,因为原始请求已完成,这是在重定向到注销端点之前处理的,会话中仍有用户信息

这个问题有什么解决办法吗。类似于“请求所有端点后,只会在所有重定向后调用一次”,这样它只会闪烁消息一次(或者在不满足条件时为零次)


1条回答
网友
1楼 · 发布于 2024-04-18 17:58:16

最后,我通过编辑我的layout.html页面解决了当前的问题

我的应用程序中的每个Jinja模板都使用布局,因此解决方案是使用简单的Jinja if语句,该语句要求使用verified变量。如果是真的,它只会显示div,并显示一条消息,通知用户该电子邮件地址未经验证。我向div添加了与经典flash消息相同的类,这样它看起来与flash消息完全相同

{% if not verified %}
  <div class="msg info">Your email address is still not verified, ...</div>
{% endif %}

并且verified变量总是在@before_request方法中刷新,并设置为g.verified(全局变量-flask.g)。然后通过重写render_template()方法将其传递给每个Jinja模板(每个端点),如下所示:

import flask
from flask import g

@app.before_request
def set_user_info():
    g.verified = is_user_verified()

def render_template(template, **kwargs):
    return flask.render_template(template, verified=g.config, **kwargs)

这可能不是最好的解决方案,但我更喜欢它,而不是问题下面评论中提到的解决方案

相关问题 更多 >