Сообщение мигает flask, если пользователь трижды ввел неправильный пароль - PullRequest
0 голосов
/ 08 мая 2020

Каждый раз, когда я использую этот logi c, чтобы выдать sh это сообщение («Вы превысили максимальное количество попыток»), когда кто-то 3 раза вводил неправильный пароль, он не выполняется, я знаю, что переменная счетчика переназначена на 0 после каждую казнь. Как я могу этого избежать?

@app.route("/signin",methods=["POST","GET"])
def signin():
  counter=0
  if request.method=="POST":
      email=request.form.get("email")
      password=request.form.get("password")
      user=User.query.filter_by(email=email).first()
      if not user:
          flash('User not found')
          return redirect(url_for('signin'))
      if not pbkdf2_sha256.verify(password,user.hash):
          flash('Incorrect password')
          return redirect(url_for('signin'))
          counter+=1
          if counter==3:
              flash('You have exceeded maximum no of tries')
              return redirect(url_for('signin'))
      login_user(user)
      return redirect(url_for('index'))
  return render_template("signin.html")

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вам необходимо сохранить количество попыток входа в систему во внешнем хранилище. Один из вариантов - использовать модель User: добавить целочисленный столбец login_attempts с нулевым значением по умолчанию. Ваш обработчик входа может выглядеть так:

@app.route("/signin",methods=["POST", "GET"])
def signin():
    if request.method == "GET":
        return render_template("signin.html")

    email = request.form.get("email")
    password = request.form.get("password")
    user = User.query.filter_by(email=email).first()
    if not user:
        flash("User not found")
        return redirect(url_for("signin"))
    if user.login_attempts >= 3:
        flash('You have exceeded maximum no of tries')
        return redirect(url_for('signin'))
    if not pbkdf2_sha256.verify(password, user.hash):
        user.login_attempts += 1
        db.session.commit()
        flash('Incorrect password')
        return redirect(url_for('signin'))
    login_user(user)
    return redirect(url_for('index'))
0 голосов
/ 08 мая 2020

Вы можете попробовать использовать counter как переменную сеанса. Примерно так:

@app.route("/signin",methods=["POST","GET"])
def signin():
    if 'counter' not in session:
        session['counter'] = 0
    if request.method=="POST":
       email=request.form.get("email")

    # Code skipped

     if not pbkdf2_sha256.verify(password,user.hash):
        flash('Incorrect password')
        # return redirect(url_for('signin'))
        session['counter'] = session.get('counter') + 1
        if session.get('counter')==3:
           flash('You have exceeded maximum no of tries')
           session.pop('counter', None)
           return redirect(url_for('signin'))
...