0

我有一个登录视图功能,在 3 次登录尝试失败后会阻止用户

功能如下

def my_login(request):
  context = {}
  if request.method == 'POST':
    form = LoginForm(request.POST)
    user_id = form.cleaned_data['user_id']
    user_password = form.cleaned_data['password1']
    if form.is_valid:
      try:
        usr = Users.objects.get(pk=user_id)
      except:
        context['form'] = form
        context['msg'] = "User Not Found"
        return render(request, 'login.html', context)
      
      '''
      ## code for blocking 
      '''

      if user_password == usr.password1:
        usr.login_attempt = 0
        usr.save()
        login(usr)
        return redirect('dashbord')
      else:
        usr.login_attempt += 1
        usr.save()
        context['msg'] = f"Attempts tried { str(usr.login_attempt)}"
        form = LoginForm()
        context['form'] = form
  return render(request, 'login.html', context)
      

这里的问题是,当我输入错误的密码时,它会呈现到登录页面,但是当我单击重新加载时,表单再次重新提交并且login_attempt得到更新

我不想要这种行为,所以如何在单击重新加载时停止重新提交表单

我假设的一种可能的解决方案是在视图中操作请求对象, request = HttpRequest()但它在 csrf 验证时失败。有没有可能克服这个问题

4

1 回答 1

0

当密码错误时,您需要在表单提交成功后重定向到同一个视图,而不是重新渲染视图。您可以利用 Django 的消息传递框架https://docs.djangoproject.com/en/dev/ref/contrib/messages/传递消息

from django.contrib import messages

    else:
        usr.login_attempt += 1
        usr.save()
        messages.warning(request, f"Attempts tried { str(usr.login_attempt)}")
        return redirect(reverse('login')) # or whatever your url is called

然后在你的模板中是这样的:

{% if messages %}
  {% for message in messages %}
    <p>{{ message }}</p>
  {% endfor %}
{% endif %}
于 2021-11-10T11:49:00.503 回答