You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改点

  1. 修复类缩进:将users类的属性和__init__方法缩进,确保属于类定义,解决"不可下标访问"的错误
  2. 数据库初始化优化:用@before_first_request装饰器确保数据库只初始化一次,且检查管理员是否存在,避免主键重复异常
  3. 路由逻辑修正:将POST请求的处理代码放入if分支内,使用request.form.get()(比直接用[]更安全,避免键不存在报错)
  4. 完善查询逻辑:添加登录成功/失败的判断反馈

内容的提问来源于stack exchange,提问作者Root

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:35:02