Flask框架LoginForm登录表单提交后无跳转、停留在原页问题求助
Flask登录提交后停留原页面问题修复方案
核心问题定位
从服务端日志可以看到登录请求为GET类型,参数直接拼接在URL中,这是导致验证逻辑不触发的直接原因:
Flask-WTF的form.validate_on_submit()方法仅对POST请求做表单校验,GET请求会直接跳过校验逻辑,返回登录页渲染结果,所以出现停留在原页面的现象。
具体问题及修复步骤
1. 前端表单提交方式错误
你当前login.html中的<form>标签未指定method属性,浏览器默认用GET方式提交表单。
修复:修改login.html的表单配置:
<form method="POST"> {{ form.hidden_tag() }} {{ form.username() }} {{ form.password() }} {{ form.submit() }} </form>
如果需要开启CSRF校验,直接删除登录视图中meta={'csrf': False}的配置即可。
2. 密码验证函数调用错误
登录视图中你调用了未定义的check_password函数,你导入的密码校验方法名为check_password_hash,也可以直接调用User类内置的校验方法。
修复:修改login视图中的密码校验逻辑:
# 将原代码if check_password(user.password, form.password.data):替换为以下任意一种 # 方式1:调用User实例自带方法 if user.check_password(form.password.data): # 方式2:调用导入的werkzeug方法 # if check_password_hash(user.password, form.password.data):
3. Flask-Login用户主键不匹配
你的User模型主键命名为id_user,而Flask-Login的UserMixin默认读取id属性作为用户唯一标识,登录成功后也会出现鉴权错误。
修复:在User类中添加get_id方法重写默认逻辑:
class User(db.Model, UserMixin): id_user = db.Column(db.Integer, primary_key=True) # 其余原有字段不变 def get_id(self): return str(self.id_user)
4. User类权限方法逻辑错误
你当前User类中is_anonymous返回True,会导致登录后的用户被识别为匿名用户;is_authenticated直接返回True,和字段逻辑不匹配,同步修改如下:
def is_authenticated(self): return self.authenticated def is_anonymous(self): return False
修复以上问题后登录功能即可正常运行。
内容的提问来源于stack exchange,提问作者AlexC
相关产品推荐
相关产品推荐

