#javascript #html #django
Вопрос:
Я создаю веб-сайт в качестве своего окончательного проекта и хочу отобразить сообщение для пользователей, которым не удалось войти в систему более 3 раз, с предложением сбросить свои пароли.
Я уже пробовал различные решения, которые нашел в Интернете, но ничего не помогает.
Я пишу бэкэнд на Django, но Django-axes также не работал для меня, поэтому сейчас я пытаюсь JS.
lt;script type="text/javascript"gt; var login_attempts = 3; function checkAttempts() { var failed_alert = document.querySelectorAll("a")[0].textContent; if (failed_alert === " Invalid username or password ") { login_attempts--; console.log(login_attempts); alert('failed login') if (login_attempts==0) { alert("Do you want to reset your password?"); } } else { console.log(login_attempts); return false; } } lt;/scriptgt;
Это пример, который я нашел в разделе Переполнение стека. Я думаю, что близок к решению этой проблемы, я получаю сообщения, но при печати «login_attemps» в консоли сначала я получаю 3, а затем непрерывно 2, независимо от того, сколько раз я пишу неверный пароль.
Функция вызывается в форме. Я также пытался сделать это в body onload=»»
lt;form id="login-form" class="form" action="login" method="post" onsubmit="checkAttempts();"gt;
Вся аутентификация реализована в views.py джанго:
def login(request): if request.user.is_authenticated: return redirect('/') else: if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = auth.authenticate(username=username, password=password) if user is not None: auth.login(request, user) return HttpResponseRedirect(request.GET.get('next', LOGIN_REDIRECT_URL)) else: messages.info(request, 'Invalid username or password') return redirect('login.html') else: return render(request, 'login.html')
Я чувствую, что теряю свои идеи. Я пытался решить эту проблему в течение 2 недель без каких-либо последствий. Если у кого-нибудь есть какие-либо идеи, я был бы благодарен. Это может быть как в js, так и в django.
Комментарии:
1. Куда вы звоните на сервер? Если вы только отправите форму, то скрипт не сделает ничего полезного
2. @mplungjan что ты имеешь в виду под этим? сервер запускается с помощью python manage.py запустите сервер в cmd
3.
onsubmit="checkAttempts();"
выполняется ДО доступа к серверу, и весь сценарий будет сброшен, ЕСЛИ форма будет отправлена4. @mplungjan как мне вызвать сервер?
Ответ №1:
Я бы ожидал чего-то вроде
document.getElementById('login-form').addEventListener('submit', function(e) { e.preventDefault(); fetch('login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ 'username': this.username.value, 'password': this.password.value }) }) .then((response) =gt; response.json()) .then((data) =gt; { console.log('Success:', data); // here we are logged in }) .catch((error) =gt; { console.error('Error:', error); }); });
Комментарии:
1. Должен ли он быть добавлен независимо в мою отправку или я должен использовать его вместо своей функции? Или все проверяемое количество попыток должно быть в улове((ошибка)?
2. Вместо вашего скрипта и счетчика и
alert('failed login')
в функции ошибок. Счетчик должен быть возвращен из сценария, а не жестко закодирован, так как они могут просто сделатьlogin_attempts = 10000;
3. о боже, это сработало, Большое тебе спасибо!
4. ИВ. Рад, что дал вам некоторое представление