Как сделать так, чтобы функция маршрута во Flask запускалась при каждой загрузке формы - PullRequest
0 голосов
/ 13 октября 2019

У меня есть простая форма с полем пароля во 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 Ответ

1 голос
/ 13 октября 2019

Вам необходимо обновить значение шанса в БД также после внесения изменений в атрибут chances.

@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)
...