Flask中如何停用用户账号(即修改is_active属性值)
实现方式说明
is_active 和你熟悉的、靠login_user()/logout_user()控制的会话级属性is_authenticated不一样,它是绑定用户账号本身的持久化状态,不能通过登录登出方法修改,需要把状态存在用户数据里,由业务逻辑直接赋值。
具体实现步骤
第一步:在用户模型中新增持久化的
is_active字段
如果你用Flask-SQLAlchemy做ORM、且用户类继承了Flask-Login提供的UserMixin,直接加同名字段即可,字段值会自动覆盖UserMixin默认返回True的is_active方法:from flask_login import UserMixin from your_db_init_file import db # 你项目中初始化的SQLAlchemy实例 class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), unique=True, nullable=False) password_hash = db.Column(db.String(200), nullable=False) # 新增账号状态字段,默认新注册用户为正常激活状态 is_active = db.Column(db.Boolean, default=True, nullable=False)如果你没有继承
UserMixin、是自定义实现的用户类,只要给类加一个is_active属性,读取对应存储的账号状态值即可。第二步:触发违规封禁逻辑时,直接修改该字段值
当判定用户违规需要封禁时,查到对应用户记录,把is_active设为False后提交数据持久化即可:# 示例:管理员封禁用户的接口逻辑 @app.route("/admin/ban/<int:user_id>") @admin_permission_required def ban_violation_user(user_id): ban_user = db.get_or_404(User, user_id) ban_user.is_active = False db.session.commit() return "账号已因违规被封禁"第三步:补充登录和请求校验逻辑
- 登录接口增加前置判断:用户账号密码校验通过后,如果发现
is_active为False,直接返回封禁提示,不要调用login_user()发放登录凭证:@app.route("/login", methods=["POST"]) def login(): user = User.query.filter_by(username=request.form.get("username")).first() if not user or not user.check_password(request.form.get("password")): return "用户名或密码错误" if not user.is_active: return "账号存在违规行为,已被限制登录,请联系管理员" login_user(user) return "登录成功" - 已登录用户的会话自动拦截:Flask-Login每次请求都会通过你写的
user_loader加载用户实例,只要数据库里is_active为False,框架会自动判定账号不可用,拦截需要登录才能访问的资源,不需要额外写判断逻辑。如果需要让被封禁的已登录用户立刻掉线,可以在封禁操作时主动清理对应用户的有效会话,否则用户下次发起请求时也会被自动拦截。
- 登录接口增加前置判断:用户账号密码校验通过后,如果发现
注意点
- 不要在会话层面临时修改
is_active值,这个状态是账号本身的属性,必须持久化存储,否则服务重启、用户清除本地缓存后封禁状态就会失效。 - 不要混淆
is_authenticated和is_active的作用:前者只校验用户携带的登录凭证是否合法,后者是账号本身的可用性开关,就算凭证合法,is_active为False的账号也无法正常使用需要登录的功能。
内容的提问来源于stack exchange,提问作者DMcC
相关产品推荐
相关产品推荐

