计算Flask中的登录尝试次数

时间:2016-08-08 09:03:02

标签: 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)

输出始终是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 %}

2 个答案:

答案 0 :(得分:4)

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

您需要在两次通话之间存储该计数。一个好的地方就是用饼干; Flask包含sessions API以使这更简单。

答案 1 :(得分:2)

我已经尝试过并且有效

@app.route('/',methods=['GET'])
def home():
    session['attempt'] = 5
@app.route('/login')
def login():
    username = request.form.get('username')
    session['username'] = username
    password = request.form.get('password')
    if username and password and username in users and users[username] == password:
        session['logged_in'] = True
        return redirect(url_for('index'))
    attempt= session.get('attempt')
    attempt -= 1
    session['attempt']=attempt
    #print(attempt,flush=True)
    if attempt==1:
        client_ip= session.get('client_ip')
        flash('This is your last attempt, %s will be blocked for 24hr, Attempt %d of 5'  % (client_ip,attempt), 'error')
    else:
        flash('Invalid login credentials, Attempts %d of 5'  % attempt, 'error')
    return redirect(url_for('login'))