Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305

Почему не работает перенаправление на страницу?

23.01.2020, 10:33. Показов 3778. Ответов 1

Студворк — интернет-сервис помощи студентам
Реализую авторизацию на сайте без использования форм, чтобы не отправлять пароль на сервер.

login.html:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Авторизация</title>
    <link rel="stylesheet" href="../static/css/login.css">
    <script type="text/javascript" src="../static/js/crypto-js.min.js"></script>
    <script type="text/javascript" src="../static/js/login.js"></script>
</head>
<body>
    <div class="container">
        <div class="block">
            <p id="autorization">Вход</p>
            <div class="form">
                <p><label>Логин<br><input type="text" id="username"></label></p>
                <p><label>Пароль<br><input type="password" id="password"></label></p>
                <p><label><input type="checkbox" id="remember">Запомнить меня</label></p>
                <p><button id="submit">Отправить</button></p>
 
                {% for category, message in get_flashed_messages(with_categories=True) %}
                    {% if category == 'error' %}
                        <p class="error-msg">{{ message }}</p>
                    {% endif %}
                {% endfor %}
 
            </div>
        </div>
    </div>
</body>
</html>
При нажатии на кнопку "Отправить" выполняется метод onsubmit.

login.js:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
window.onload = function() {
    let submit = document.querySelector('button#submit');
    submit.addEventListener('click', onsubmit)
};
 
function onsubmit() {
    let username = document.querySelector('input#username').value;
    
    let xhr = new XMLHttpRequest();
    let send = JSON.stringify({'username': username});
    xhr.open('POST', '/password-data', true);
    xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
    xhr.send(send);
    
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            let data = JSON.parse(xhr.responseText);
            if ('salt' in data && 'hash' in data) {
                let password = document.querySelector('input#password').value;
                let remember = document.querySelector('input#remember').value === 'on';
                let hash = CryptoJS.PBKDF2(password, data.salt,
                    {keySize: 512/32, hasher: CryptoJS.algo.SHA512, iterations: 10000});
                let xhr = new XMLHttpRequest();
                let send = JSON.stringify({
                    'username': username,
                    'hash': hash.toString(),
                    'remember': remember
                });
                xhr.open('POST', '/login/', true);
                xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
                xhr.send(send);
                xhr.onreadystatechange = function() {
                    console.log(xhr.readyState, xhr.responseText)
                }
            }
        }
    }
}
Все это дело обрабатывает Flask приложение.

auth/views.py

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@auth.route('/get-password-data', methods=['POST'])
def get_password_data():
    data = request.get_json()  # {'username': username}
    username = data['username']
    user = db.session.query(User).filter(User.username == username).first()
    if user:
        response = {
            'salt': user.password_salt,
            'hash': user.password_hash
        }
        return json.dumps(response), 200, {'ContentType': 'application/json'}
    return (json.dumps({'message': 'No user'}), 200,
            {'ContentType': 'application/json'})
 
@auth.route('/login/', methods=['POST', 'GET'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('main.index'))
 
    if request.method == 'POST':
        # data == {'username': str, 'hash': str, 'remember': bool}
        data = request.get_json()
        user = db.session.query(User).filter(
            User.username == data['username']).first()
        if user and user.password_hash == data['hash']:
            login_user(user, remember=data['remember'])
            return redirect(url_for('main.index'))
        flash(u'Неверный логин/пароль', 'error')
        return redirect(url_for('auth.login'))
    return render_template('login.html')
Когда пользователь вводит некорректный пароль, должно произойти перенаправление на /login/ + вывести сообщение об ошибке (cм. в шаблоне цикл по сообщениям). Если пользователь ввел корректный пароль, то должно произойти перенаправление на страницу main.index ('/').

Этого не происходит. Т.е. при вводе корректного пароля, страница не переходит '/', но пользователь считается авторизованным, т.к. если самому перезапустить страницу /login/ перенаправит на '/' (это из-за условия в начале функции login). Ну и при вводе некорректного пароля тоже ничего не происходит. Хотя, если вывести ответ сервера на POST запрос /login/, видно, что возвращается страница, на которую должно произойти перенаправление.

Раньше, когда использовал форму для авторизации, все работало, при этом обработчик '/login/' выглядел следующим образом:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class LoginForm(FlaskForm):
    username = StringField("Username", validators=[DataRequired()])
    password = StringField("Password", validators=[DataRequired()])
    remember = BooleanField("Remember Me")
    submit = SubmitField()
 
@auth.route('/login/', methods=['POST', 'GET'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('main.index'))
 
    form = LoginForm()
    if form.validate_on_submit():
        user = db.session.query(User).filter(
            User.username == form.username.data).first()
        if user and user.check_password(form.password.data):
            login_user(user, remember=form.remember.data)
            return redirect(url_for('main.index'))
 
        flash(u'Неверный логин/пароль', 'error')
        return redirect(url_for('auth.login'))
    return render_template('login.html', form=form)
Вопрос: почему не работает перенаправление?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2020, 10:33
Ответы с готовыми решениями:

Не работает проверка теста и перенаправление на другую страницу.
Есть тест который читается из файла. Когда подходит очередь последнего вопроса должна также происходить проверка правильности ответа и...

Почему не добавляется изображение на страницу? не работает createElement
&lt;!doctype html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;script src=&quot;main.js&quot; async&gt;&lt;/script&gt; &lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;...

Поиск не работает, почему? Он выдает просто страницу с кодом
&lt;?php $connection = mysqli_connect('localhost','root','',''); $output=''; if(isset($_POST)){ $searchkey= $_POST; ...

1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
23.01.2020, 13:29
Лучший ответ Сообщение было отмечено ioprst как решение

Решение

ioprst, насколько я помню, то если уходит запрос через js, то нужно обратно возвращать клиенту в JsonResponse адрес страницы для рекдиректа и дальше уже через js способы редиректить юзера на этот адрес.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2020, 13:29
Помогаю со студенческими работами здесь

Почему не работает перенаправление header("Location: ")? выводит только его html
Добрый день, у меня такая проблема: есть простая страничка, я убрал оттуда все лишнее и оставил только это: &lt;?php ...

Перенаправление на страницу
Приветствую! Я полный ноль в ПХП. Вот фрагмент моей страницы с формой обратной связи: ... &lt;body&gt; &lt;!-- Настройки...

Перенаправление на ту же страницу
как сделать перенаправление на ту же страницу в экшне, например при входе в систему? если я использую getRequestUrl() то оно...

Перенаправление на страницу
Всем доброго времени суток. Проблема следующая: имеется некоторая форма для отправки данных в БД MongoDB. Необходимо, чтобы при успешном...

Перенаправление на главную страницу
Добрый день. После написания формы регистрации возник вопрос &quot;А как сделать перенаправление на главную страницу после регистрации?&quot;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru