在我的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注销用户-从会话中删除用户信息-并重定向到主页),即使没有用户技术上登录,也会出现关于未验证用户的闪现消息,因为原始请求已完成,这是在重定向到注销端点之前处理的,会话中仍有用户信息
这个问题有什么解决办法吗。类似于“请求所有端点后,只会在所有重定向后调用一次”,这样它只会闪烁消息一次(或者在不满足条件时为零次)
最后,我通过编辑我的
layout.html
页面解决了当前的问题我的应用程序中的每个Jinja模板都使用布局,因此解决方案是使用简单的Jinja if语句,该语句要求使用
verified
变量。如果是真的,它只会显示div
,并显示一条消息,通知用户该电子邮件地址未经验证。我向div
添加了与经典flash消息相同的类,这样它看起来与flash消息完全相同并且
verified
变量总是在@before_request
方法中刷新,并设置为g.verified
(全局变量-flask.g
)。然后通过重写render_template()
方法将其传递给每个Jinja模板(每个端点),如下所示:这可能不是最好的解决方案,但我更喜欢它,而不是问题下面评论中提到的解决方案
相关问题 更多 >
编程相关推荐