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