【问题标题】:How to make a route function in Flask run every time a form is loaded每次加载表单时如何在Flask中运行路由功能
【发布时间】:2023-04-09 22:19:01
【问题描述】:

我有一个简单的表单,在 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 对象中的方式有​​关。 您还需要其他信息吗?提前致谢。

【问题讨论】:

  • 您在数据库中分配给机会的默认值是多少?
  • @ParthS007 10. 这就是它的创建方式。
  • 在第二个if 声明中?

标签: python flask flask-sqlalchemy flask-wtforms


【解决方案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)

【讨论】:

  • 显然,User 没有那个方法。我得到AttributeError: 'User' object has no attribute 'save_to_db'。我应该从某个地方导入它还是自己定义它?怎么样?
  • @PauloSchreiner 我已经改变了那部分。检查更新的答案。
  • 据我所知,我创建的模型没有任何保存功能。我只是将db.session.commit 放在user.chances -= 1user.chances = 10 之后,现在它按预期工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2012-12-18
  • 2019-04-28
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多