在 Flask 中计算登录尝试次数

nal*_*zok 4 python flask flask-wtforms

我是网络开发的新手,这是我尝试过的:

@app.route('/login', methods=['GET', 'POST'])
def login():
    attempt = 0
    form = LoginForm()
    if form.validate_on_submit():
        flash('Login requested for OpenID="%s", remember_me=%s' %
              (form.openid.data, str(form.remember_me.data)))
        return redirect('/index')
    attempt += 1
    flash('Attempt(s)="%d"' % attempt)
    return render_template('login.html',
                           title='Sign In',
                           form=form)
Run Code Online (Sandbox Code Playgroud)

输出总是Attempt(s)="1",而我希望每次form.validate_on_submit()失败时数字都会增加 1 。

我观察到当我按下Sign In按钮时,login页面被刷新。但是,我在文本字段中输入的所有文本都保留在那里,所以我认为form = LoginForm()没有执行。(如果LoginForm创建了一个全新的文本,这些文本怎么还在那里?)因此我把声明放在attempt = 0上面form = LoginForm(),希望它不是每次Sign In按下时都执行,但显然这不起作用。

我认为问题在于我不知道按下 时发生了什么Sign In。函数又login被调用了吗?如果是这样,它是由谁调用的?

以下是内容login.html

{% extends "base.html" %}

{% block content %}
  <h1>Sign In</h1>
  <form action="" method="post" name="login">
      {{ form.hidden_tag() }}
      <p>
          Please enter your OpenID:<br>
          {{ form.openid(size=80) }}<br>
      </p>
      <p>{{ form.remember_me }} Remember Me</p>
      <p><input type="submit" value="Sign In"></p>
  </form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 7

网络是无状态的。每次按下提交按钮时,浏览器都会调用与该表单关联的 URL;该 URL 被路由到您的login()处理程序函数,该函数从一开始就运行。该函数本身没有先前调用的记忆(您也不希望它这样做,否则您站点的所有用户都会获得相同的登录计数)。该表单由提交请求中发送的数据填充,该数据由flask-wtf 库自动发送到表单实例化。

您需要将该计数存储在调用之间的某个位置。一个很好的地方是在 cookie 中;Flask 包含会话 API以使其更简单。