db.Model.query.filter_by()中**kwargs的格式

问题描述 投票:0回答:1

我有一个

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

我正在尝试创建一个登录表单,其中成功登录需要将用户名与密码匹配。为此,我尝试了以下查询:

user = request.form['Username']
password = request.form['Password']
found_user = users.query.filter_by(name=user, password=password).first()

然而,这个方法并没有达到预期的效果。我收到一条错误,指出

users
类不可下标,从而阻止我使用
[]
访问每行的元素。我不确定如何根据匹配的用户名和密码对用户进行身份验证。任何关于如何在这种情况下正确构建查询或处理身份验证的指导将不胜感激。

编辑:

我想我已经找到问题了:

我尝试删除 SQLAlchemy 类代码并使用以下代码:

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)

app.app_context().push()

app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///db.sqlite3'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False


db = SQLAlchemy(app)



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



 with app.app_context():

    db.create_all()

 admin = users('Admin','RootRules99','Admin')

 loggedInUsr:users

 db.session.add(admin)

 db.session.commit()

 @app.route('/',methods=['POST','GET'])

 def frontPage():

    if request.method=='POST':

        user = request.form['Username']

        password = request.form['Password']



    
    return user,password









  







 else:

    return render_template('mywebsite.html')

这个 html 网页:

<style>



button
{
    font-family: Verdana, Geneva, Tahoma, sans-serif;

    font-size: medium;

    color:black;

    background-color: aliceblue;

    border-style: hidden;

    shape-outside: border-box;

    cursor: default;

    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" id="Username" value="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>

<input type="password" id="Password" value="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"> 
</input>

<button>Sign In</button>


</body>

如果我输入凭据“Hi”和“Admin”,网站只会打印出“Hi”,这很奇怪,因为它根本没有考虑“Admin”一词。我应该如何解决这个问题?

python flask flask-sqlalchemy
1个回答
0
投票

使用在输入字段的 name 属性中定义的键来查询表单字段数据。您尚未定义名称属性,因此不会收到任何数据。
此外,您的表单元素在 HTML 代码中未正确关闭。

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)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(Integer, primary_key=True)
    username = db.Column(db.String(100))
    password = db.Column(db.String(100))

 with app.app_context():
    db.create_all()
    
    admin = User(
        username='Admin',
        password='RootRules99'
    )
    db.session.add(admin)
    db.session.commit()


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']

        print(username, password)

    return render_template('index.html')
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Sign in/Sign up</title>
</head>
<body>
    <form method="post">
        <div>
            <label for="username">Username</label>
            <input type="text" id="username" name="username" /> 
        </div>
        <div>
            <label for="password">Password</label>
            <input type="password" id="password" name="password" /> 
        </div>
        <button type="submit">Sign In</button>
    </form>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.