如果用户的密码与文本文件中的值匹配,则阻止创建用户
prevent creating a user if their password matches a value in a text file
当用户向 Flask 提交注册表单时,我想根据一个包含 10000 个常用密码的文件检查他们选择的密码。如果他们的密码与通用值匹配,我想显示一条消息而不是创建用户。
我写了下面的代码,但它总是创建用户,即使他们输入一个常用密码也是如此。我写的支票有什么问题?
@bp.route("/register", methods=["GET", "POST"])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data)
with open("VanligePassord.txt") as f:
for line in f:
if form.password.data == line[:-1]:
flash("Passordet ditt er for svakt")
else:
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
return redirect(url_for("auth.login"))
return render_template("auth/register.html", form=form)
您编写的检查在遇到错误密码时不会停止,它只会闪烁一条消息,然后继续下一个值。如果密码与错误值不匹配,它会转到 else
分支并立即提交,无论稍后是否匹配其他值。
使用any()
检查是否有任何值与密码匹配,然后根据该值闪现错误或提交。
password = form.password.data
with current_app.open_resource("common_passwords.txt") as f:
common_values = [line.rstrip("\n") for line in f]
if any(value == password for value in common_values):
flash("Don't use a common password.")
else:
user.set_password(password)
db.session.add(user)
db.session.commit()
由于您使用的是 WTForms,因此您也可以将其编写为表单验证的一部分,而不是视图的一部分。
class RegistrationForm(FlaskForm):
...
def validate_password(self, field, data):
with current_app.open_resource("common_passwords.txt") as f:
common_values = [line.rstrip("\n") for line in f]
if any(value == data for value in common_values):
raise ValidationError("Don't use a common password.")
当用户向 Flask 提交注册表单时,我想根据一个包含 10000 个常用密码的文件检查他们选择的密码。如果他们的密码与通用值匹配,我想显示一条消息而不是创建用户。
我写了下面的代码,但它总是创建用户,即使他们输入一个常用密码也是如此。我写的支票有什么问题?
@bp.route("/register", methods=["GET", "POST"])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data)
with open("VanligePassord.txt") as f:
for line in f:
if form.password.data == line[:-1]:
flash("Passordet ditt er for svakt")
else:
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
return redirect(url_for("auth.login"))
return render_template("auth/register.html", form=form)
您编写的检查在遇到错误密码时不会停止,它只会闪烁一条消息,然后继续下一个值。如果密码与错误值不匹配,它会转到 else
分支并立即提交,无论稍后是否匹配其他值。
使用any()
检查是否有任何值与密码匹配,然后根据该值闪现错误或提交。
password = form.password.data
with current_app.open_resource("common_passwords.txt") as f:
common_values = [line.rstrip("\n") for line in f]
if any(value == password for value in common_values):
flash("Don't use a common password.")
else:
user.set_password(password)
db.session.add(user)
db.session.commit()
由于您使用的是 WTForms,因此您也可以将其编写为表单验证的一部分,而不是视图的一部分。
class RegistrationForm(FlaskForm):
...
def validate_password(self, field, data):
with current_app.open_resource("common_passwords.txt") as f:
common_values = [line.rstrip("\n") for line in f]
if any(value == data for value in common_values):
raise ValidationError("Don't use a common password.")