Flask-SQLAlchemy用户登录验证问题及表单数据获取异常解决
问题与解决方案
问题1:表单提交无法获取密码
原因
HTML表单的<input>标签仅设置了id属性,Flask的request.form依赖标签的name属性来获取提交的值,没有name属性的输入无法被识别。
修正后的HTML代码
<style> button { font-family: Verdana, Geneva, Tahoma, sans-serif; font-size: medium; color:black; background-color: aliceblue; border-style: hidden; cursor: pointer; height: 36px; width: 144px; border-radius: 9px; top: 500px; left: 680px; position: absolute; } button:hover { background-color: orangered; } </style> <head> <title>Sign in/Sign up</title> </head> <body background="backColorWebsite.png"> <form action="/" method="post"> <input type="text" name="Username" id="Username" placeholder="Username" style="font-family:Verdana, Geneva, Tahoma, sans-serif; background-color: aliceblue; position: absolute; top:250px;left:680px; width:144px; height:27px; border-radius: 9px; color:gray" maxlength="10"> <input type="password" name="Password" id="Password" placeholder="Password" style="font-family:Verdana, Geneva, Tahoma, sans-serif; background-color: aliceblue; position: absolute; top:350px;left:680px; width:144px; height:27px; border-radius: 9px; color:gray" maxlength="10"> <button type="submit">Sign In</button> </form> </body>
关键修改点
- 给两个
<input>标签添加name="Username"和name="Password"属性 - 把
value替换为placeholder,避免默认值干扰输入 - 表单
action设为/(对应Flask的根路由),并给按钮添加type="submit"明确提交行为
问题2:登录查询的下标访问错误及代码逻辑修复
原因
原Python代码存在多处缩进错误(类属性、方法、路由函数逻辑缩进混乱),导致users类定义不完整,无法正确使用SQLAlchemy的查询方法;同时路由函数逻辑错误,POST请求的返回语句不在分支内。
修正后的Python代码
from flask import Flask, render_template, request from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 修正类的缩进,确保属性和方法属于users类 class users(db.Model): name = db.Column('name', db.String(100), primary_key=True) password = db.Column('password', db.String(100)) role = db.Column('role', db.String(100)) def __init__(self, name: str, password: str, role: str): self.name = name self.password = password self.role = role # 初始化数据库,避免重复添加管理员 @app.before_first_request def init_db(): db.create_all() # 检查管理员是否已存在,防止主键重复错误 admin_exists = users.query.filter_by(name='Admin').first() if not admin_exists: admin = users('Admin', 'RootRules99', 'Admin') db.session.add(admin) db.session.commit() @app.route('/', methods=['POST', 'GET']) def frontPage(): if request.method == 'POST': # 获取表单提交的值 user = request.form.get('Username') password = request.form.get('Password') # 正确的数据库查询逻辑 found_user = users.query.filter_by(name=user, password=password).first() if found_user: # 登录成功的逻辑,比如返回用户信息或跳转 return f"登录成功,欢迎 {found_user.name}" else: # 登录失败的逻辑 return "用户名或密码错误" else: return render_template('mywebsite.html') if __name__ == '__main__': app.run(debug=True)
关键修改点
- 修复类缩进:将
users类的属性和__init__方法缩进,确保属于类定义,解决"不可下标访问"的错误 - 数据库初始化优化:用
@before_first_request装饰器确保数据库只初始化一次,且检查管理员是否存在,避免主键重复异常 - 路由逻辑修正:将POST请求的处理代码放入
if分支内,使用request.form.get()(比直接用[]更安全,避免键不存在报错) - 完善查询逻辑:添加登录成功/失败的判断反馈
内容的提问来源于stack exchange,提问作者Root
相关产品推荐
相关产品推荐

