登录功能Flask问题

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

我的登录功能一直存在问题,无法获取存储的登录信息进行登录。因此,例如,我将在我的应用程序上注册,然后当我尝试使用刚刚创建的信息登录时,我去使用登录信息,它会闪烁我设置的消息,但密码和电子邮件是正确的。关于上班有什么想法吗?

@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        email = request.form['email']
        password = request.form['password']
        users = Users.query.filter_by(email=email)
        if users.count() == 1:
            user = users.first()
            if check_pw_hash(password, user.pw_hash):
                session['user'] = user.email
                flash('welcome back, ' + user.email)
                return redirect("/")
        flash('bad username or password')
        return redirect("/login")

{% extends "base.html" %}
{% block content %}

<h2>Login</h2>
<form action="/login" method="post">
  <p><label>Email<input type="text" name="email"/></label></p>
  <p><label>Password<input type="password" name="password"/></label></p>
  <p><input type="submit" value="Login"/></p>
</form>

{% endblock %}
python authentication flask flask-login
1个回答
0
投票

根据您定义

Users
表的方式,可能有超过 1 个用户具有相同的电子邮件地址,这将导致
count()
不为 1。确保电子邮件被定义为唯一的 AND存在于您的数据库中。

class Users(Base):
    id: Mapped[int] = mapped_column(primary_key=True)
    email: Mapped[str] = mapped_column(unique=True)
    password: Mapped[str]

另一个选择是您没有发布该函数的代码

check_pw_hash(password, user.pw_hash)
。 Werkzeug 确实提供了一个实用函数来检查密码哈希值
werkzeug.security.check_password_hash(pwhash, password)
,第一个参数
pwhash
是存储在数据库中的哈希密码,第二个参数
password
是来自输入的纯文本密码。您的函数中可能会混淆它们,从而导致密码检查失败。你应该做类似的事情:

from werkzeug.security import check_password_hash

def login():
  if request.method == "POST"
    # stuff
    if check_password_hash(user.password, request.form.get("password")):
      # set session
      return redirect("/")
    else:
      flash('bad username or password')
  return render_template("login.html")

© www.soinside.com 2019 - 2024. All rights reserved.