如何在 python Flask 中重新加载页面时清除登录错误消息?

问题描述 投票:0回答:1

我正在创建一个登录系统,其中计算机检查用户输入的电子邮件和密码是否存在于用户数据库中,如果存在,则将用户发送到仪表板路由。但是,如果用户不存在,则屏幕上应显示错误,指出电子邮件或密码不正确。我通过将警告消息传递到 html 模板来正确呈现错误,但由于某种原因,当页面重新加载时,即使字段为空,错误仍然存在。

用于检查用户是否存在的后端代码,如果存在则将用户发送到仪表板,但如果用户不存在则显示警告文本:

@app.route("/", methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        email = request.form.get("email")
        psw = request.form.get("password")
        users = fetch_users()
        if check_user_exist(email, psw):
            return render_template('dashboard.html', users=users)
        
        return render_template('login.html', warning = "Email or Password is incorrect")
    

    return render_template('login.html', warning = "")

html代码:

{% if warning %}
        <div class="warning">
            {{ warning }}
        </div>
        {% endif %}

我已经尝试过在不需要错误消息时通过说 session.pop('warning', None) 来使用会话变量,并使用 session['warning'] = "电子邮件已注册。请登录。"当我需要显示错误消息并通过 html 模板传递该消息但同样的问题仍然存在(重新加载后错误不会消失)

使用会话的后端代码:

@app.route("/", methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        email = request.form.get("email")
        psw = request.form.get("password")
        users = fetch_users()
        if check_user_exist(email, psw):
            # Clear the warning message from the session
            session.pop('warning', None)
            return render_template('dashboard.html', users=users)
        
        # Set the warning message in the session
        session['warning'] = "Email or Password is incorrect"
        return render_template('login.html')

    return render_template('login.html')

前端代码:

{% if session.warning %}
<div class="warning" role="alert">
    {{ session.warning }}
</div>
{% endif %}
python sqlite flask web-development-server flask-session
1个回答
0
投票

因为

session
可能会永远保留它,所以你应该在每次登录之前清除它``

@app.route("/", methods=['GET', 'POST'])
def login():
    session['warning'] = None
    # ... rest ...

但是 Flask 还有一个特殊的功能

flashing messages
可以创建显示后删除的消息。

消息闪烁 — Flask 文档 (2.3.x)

flash('Invalid password provided', 'error')
{% with messages = get_flashed_messages() %}
  {% if messages %}
    <ul class=flashes>
    {% for message in messages %}
      <li>{{ message }}</li>


更多详情请参阅上面的链接。


如果您将模块用于表单,那么他们将允许分配仅显示一次的错误消息

© www.soinside.com 2019 - 2024. All rights reserved.