Flask如何实现用户自主删除账号功能,怎么使用Flask-Security的delete_user
Flask用户自主注销账号实现方案
方案1:使用Flask-Security自带delete_user方法实现
前置配置
首先确保你已经正确初始化Flask-Security的用户数据存储:
from flask_security import Security, SQLAlchemyUserDatastore # 不需要角色管理的话,第二个参数可传None user_datastore = SQLAlchemyUserDatastore(db, User, None) security = Security(app, user_datastore)
补充User模型方法
新增密码验证方法,用于注销前的二次校验:
from werkzeug.security import check_password_hash class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) password_hash = db.Column(db.String(128)) # 新增密码校验方法 def verify_password(self, password): return check_password_hash(self.password_hash, password)
编写注销视图
from flask import render_template, redirect, url_for, flash, request from flask_login import login_required, current_user, logout_user @app.route('/account/delete', methods=['GET', 'POST']) @login_required def delete_account(): if request.method == 'POST': # 二次校验密码,防止误删/恶意操作 input_pwd = request.form.get('confirm_password', '') if not current_user.verify_password(input_pwd): flash('密码验证失败,无法注销账号') return redirect(url_for('delete_account')) # 调用Flask-Security方法删除用户记录 user_datastore.delete_user(current_user) db.session.commit() # 清除用户登录会话 logout_user() flash('您的账号已成功注销') return redirect(url_for('index')) # GET请求返回确认提示页 return render_template('delete_account_confirm.html')
方案2:原生SQLAlchemy实现(无需依赖Flask-Security)
如果你的项目没有引入Flask-Security,直接操作数据库删除用户即可,视图逻辑和方案1基本一致,仅替换删除逻辑即可:
# 替换user_datastore.delete_user(current_user) 为以下代码 db.session.delete(current_user) db.session.commit()
注意事项
- 注销操作属于高风险操作,必须添加二次校验逻辑,除密码校验外也可选择短信验证码、邮箱验证码校验
- 如果用户表和其他业务表存在外键关联,需要提前处理关联数据:可配置数据库级联删除,或提前删除/修改关联的业务数据,避免触发外键约束报错
- 可根据业务需求增加注销冷静期逻辑,用户提交申请后保留3-7天数据,期间可撤销注销申请,到期后再自动删除数据
内容的提问来源于stack exchange,提问作者Yehui He
相关产品推荐
相关产品推荐

