You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Flask密码重置提交后无法跳转至login.html页面?

问题分析与修复方案

你的跳转问题主要出在finally块的错误使用,以及可能存在的表单验证失败情况,咱们一步步来解决:

1. 核心问题:finally块的逻辑误用

在你的代码里,finally块会无视try-except的执行结果强制运行——哪怕token过期触发SignatureExpired异常,finally里的return redirect也会覆盖except里的返回。更严重的是,这会导致就算token无效,你也会执行更新密码的SQL操作,完全不符合业务逻辑。

另外,如果form.validate()验证不通过,代码会直接返回newpassword.html,这也会让页面停留在当前页,你需要先确认表单验证是否能正常通过。

2. 修复后的代码

@app.route('/forgotpasswd/<token>',methods=['GET', 'POST'])
def forgot_passwd(token):
    form = Newpasswd(request.form)
    if request.method == "POST" and form.validate():
        password = form.passwd.data
        cursor = None
        try:
            # 先验证token有效性
            email = secret.loads(token, salt='forgotpasswd', max_age=3600)
            # 验证成功后再执行密码更新
            cursor = Mysql.connection.cursor()
            sorgu = "UPDATE users set password='{}' WHERE email= '{}' ".format(password,email)
            cursor.execute(sorgu)
            Mysql.connection.commit()
            flash("password changed","success")
            return redirect(url_for("login"))
        except SignatureExpired:
            flash("Timeout","danger")
            return render_template("index.html")
        except Exception as e:
            # 捕获数据库操作等其他异常
            flash(f"An error occurred: {str(e)}","danger")
            # 出错时回滚事务,保证数据一致性
            if Mysql.connection:
                Mysql.connection.rollback()
        finally:
            # finally仅用于清理资源,比如关闭游标
            if cursor:
                cursor.close()
        # 验证或更新失败时返回原页面
        return render_template("newpassword.html",form=form)
    # GET请求或表单验证失败,返回新密码页面
    return render_template("newpassword.html",form=form)

3. 关键修改说明

  • 把密码更新逻辑移到try块内部:只有token验证成功时才执行更新,避免无效的数据库操作。
  • finally块仅做资源清理:不再包含业务逻辑和返回语句,避免覆盖try/except里的返回结果。
  • 补充异常捕获与回滚:处理数据库操作可能出现的错误,同时添加事务回滚保证数据安全。
  • 增加表单错误排查:可以在newpassword.html模板里添加表单错误显示,方便排查验证失败原因:
    {% for field, errors in form.errors.items() %}
      <div class="alert alert-danger">
        {{ field }}: {{ ', '.join(errors) }}
      </div>
    {% endfor %}
    

4. 额外检查项

  • 确认前端表单的method为POST,且action指向当前路由(或留空默认提交到当前URL)。
  • 检查Newpasswd表单类的验证规则(比如密码长度、格式要求)是否合理,确保用户输入能通过验证。

内容的提问来源于stack exchange,提问作者Apple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:52:27