欢迎访问宙启技术站
智能推送

如何在Flask应用中使用flask_login.current_user实现用户密码重置功能

发布时间:2023-12-24 23:24:54

在Flask应用中使用flask_login.current_user实现用户密码重置功能需要进行以下步骤:

1. 导入必要的模块和类:

from flask import Flask, render_template, redirect, url_for, request, flash
from flask_login import LoginManager, login_required, current_user, login_user, logout_user
from werkzeug.security import generate_password_hash, check_password_hash

2. 初始化Flask应用和LoginManager:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
login_manager = LoginManager()
login_manager.init_app(app)

3. 创建一个用户类,并进行必要的数据库模型设计:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    password = db.Column(db.String(100), nullable=False)
    # 其他用户属性...

    def set_password(self, password):
        self.password = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password, password)

4. 定义用户登录回调函数以及密码重置路由:

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.route('/reset_password', methods=['GET', 'POST'])
def reset_password():
    if request.method == 'POST':
        current_password = request.form['current_password']
        new_password = request.form['new_password']
        confirm_password = request.form['confirm_password']

        if current_user.check_password(current_password):
            if new_password == confirm_password:
                current_user.set_password(new_password)
                db.session.commit()
                flash('密码重置成功', 'success')
                return redirect(url_for('profile'))
            else:
                flash('确认密码不一致', 'error')
        else:
            flash('当前密码不正确', 'error')

    return render_template('reset_password.html')

5. 编写相应的路由和视图函数以及模板文件:

@app.route('/profile')
@login_required
def profile():
    return render_template('profile.html')

# reset_password.html
{% extends 'base.html' %}

{% block content %}
  <h2>重置密码</h2>
  <form method="post" action="{{ url_for('reset_password') }}">
    <div class="form-group">
      <label for="current_password">当前密码</label>
      <input type="password" class="form-control" id="current_password" name="current_password" required>
    </div>
    <div class="form-group">
      <label for="new_password">新密码</label>
      <input type="password" class="form-control" id="new_password" name="new_password" required>
    </div>
    <div class="form-group">
      <label for="confirm_password">确认密码</label>
      <input type="password" class="form-control" id="confirm_password" name="confirm_password" required>
    </div>
    <button type="submit" class="btn btn-primary">重置密码</button>
  </form>
{% endblock %}

以上就是使用flask_login.current_user实现用户密码重置功能的基本步骤和示例代码。在这个例子中,我们首先导入所需的模块和类,然后初始化Flask应用和LoginManager。接下来,我们创建了一个User类来定义用户模型,并编写了一个登录回调函数和一个密码重置路由。在密码重置路由内部,我们首先获取用户输入的当前密码、新密码和确认密码,然后通过check_password函数验证当前密码是否正确。如果验证通过,我们再检查新密码和确认密码是否一致,如果一致,就使用set_password函数更新用户的密码,并将修改信息保存到数据库中。最后,我们使用flash函数向用户显示成功或错误信息,并重定向到用户的个人资料页面。在模板文件中,我们使用表单来接收用户输入的当前密码、新密码和确认密码。

需要注意的是,上述代码中使用了数据库来保存用户信息,你可能需要根据自己的情况进行相应的修改。另外,密码重置功能通常需要在用户登录状态下进行,因此我们通过@login_required装饰器来保护密码重置路由,确保只有已登录用户才能访问该页面。