我在Flask中有一个带有密码字段的简单表单,该表单应具有有限的机会(10)才能正确提交。问题是,即使我每次提交的值不正确时都将chances
变量减去1,chances
仅被减去一次(在9处停止),无论我有多少次提交表单并刷新页面。
这是我的路线:
@app.route('/administrator-login', methods=['GET','POST'])
def admin_login():
if current_user.is_authenticated:
return redirect('/administrator-logout')
form = AdminLogin()
user = User.query.first()
if form.validate_on_submit():
if user.chances <= 0:
return render_template(url_for('home'))
if user and form.password.data == 'password': # I will hash the actual password later
user.chances = 10
login_user(user)
return redirect('/hack-the-site-here')
elif form.password.data != 'password':
user.chances -= 1
return render_template('admin_login.html', form=form, chances=user.chances)
这是我的表格:
class AdminLogin(FlaskForm):
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
'admin_login.html'
文件
<h3>Chances left: {{ chances }}</h3>
<div class="mt-3">
<form method="POST" action="">
{{ form.hidden_tag() }}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Admin Login</legend>
<div class="form-group">
{{ form.password.label(class="form-control-label") }}
{% if form.password.errors %}
{{ form.password(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.password.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.password(class="form-control form-control-lg") }}
{% endif %}
</div>
</fieldset>
<div class="form-group">
{{ form.submit(class="btn btn-outline-info btn-lg") }}
</div>
</form>
</div>
</div>
这是User
类:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
chances = db.Column(db.Integer)
数据库中只有一个User
对象,并且不应更改。
批评和建议被接受。
我怀疑这与user.chances
存储在User对象中的方式有关。
您还需要其他信息吗?预先感谢。
答案 0 :(得分:1)
在chances
属性中进行更改后,您还需要在DB中更新机会值。
@app.route('/administrator-login', methods=['GET','POST'])
def admin_login():
if current_user.is_authenticated:
return redirect('/administrator-logout')
form = AdminLogin()
user = User.query.first()
if form.validate_on_submit():
if user.chances <= 0:
return render_template(url_for('home'))
if user and form.password.data == 'password': # I will hash the actual password later
user.chances = 10
db.session.commit()
login_user(user)
return redirect('/hack-the-site-here')
elif form.password.data != 'password':
user.chances -= 1
db.session.commit()
return render_template('admin_login.html', form=form, chances=user.chances)