在 Flask 中验证登录凭据的问题

Problem for authenticating login creds in Flask

我正在尝试验证来自我的 login.html 文件的登录请求

        <form action="{{ url_for('login') }}" method="post">
          <div class="col-sm-6">
            <h2>Already a user, Login here!</h2>
                <div class="form-group">
                    <input class="form-control" name="username" placeholder="username" required>
                </div>

                <div class="form-group">
                    <input type="password" class="form-control" name="password" placeholder="password" required>

                </div>

                <div class="form-group">
                    <button class="btn btn-primary">Log In</button>
                </div>
          </div>
        </form>

这是烧瓶片段

@app.route("/login", methods=["POST"])
def login():

    username = request.form.get("username")
    password = request.form.get("password")
    if db.execute("SELECT username FROM users WHERE username=:username AND password=:password", {"username": username, "password": password}).fetchone() == username:
        session['username'] = username
        return render_template("home.html")

    return render_template("error.html", message="username or password is incorrect",prompt="alert alert-warning")


当我输入错误的凭据时,它会提示我输入错误的凭据消息,这是我非常想要的。现在的问题是,如果我添加了正确的信用,那么它也会向我显示相同的消息。我的数据库连接正确,没有问题。我编写查询的方式有问题吗,因为我是 Flask 的初学者并且 SQL

fetchone return 是一个序列(列表),因此 if 测试永远不会为真。

来自python Sqlite3 doc:

fetchone()

Fetches the next row of a query result set, returning a single sequence, or None when no more data is available.

一个选项:由于 fetchone 的结果是一个列表,因此要与用户名进行比较的元素将是 returned 的第一个成员,即 ....fetchone()[0].

另一个选项:假设 username 是唯一的,查询将 return 一行或没有行。如果没有行,fetchone 将 return NoneNone 是错误的,因此 if 子句中不需要相等。