每次加载表单时如何在Flask中运行路由功能

时间:2019-10-12 21:33:43

标签: python flask flask-sqlalchemy flask-wtforms

我在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对象中的方式有​​关。 您还需要其他信息吗?预先感谢。

1 个答案:

答案 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)