@Ivan0_0

Redirect отправляет запрос GET, но не рендерит саму страницу. В чём проблема?

При создании регистрации для сайта, возникла проблема что redirect не переадресовывает на страницу авторизации. При том что GET запрос отправляется, а сама страница не загружается. Что не правильно?

Python
from flask import Flask, url_for, render_template, request, g, session, redirect, make_response
import jinja2
import mysql.connector
import json


app = Flask (__name__, template_folder = '../templates', static_folder = '../static')


@app.route('/')
def index():
    return render_template('index.html')

url = ''
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        data = json.loads(request.data)

    print('ok')
    return render_template('login.html')


@app.route('/registration', methods=['GET', 'POST'])
def registration():
    if request.method == 'POST':
        data = json.loads(request.data)
        name = data['name']
        print(name)
        return redirect(url_for('login'))
        
    return render_template('registration.html')


if __name__ == '__main__':
    app.run(debug=True)


Javascript регестрация
let form = document.getElementById('form');

let registration_url = '/registration' // обработчик для url

// флаги данных для проверки
let correct_name = false;
let correct_full_name = false;
let correct_login = false;
let correct_email = false;
let correct_password = false;
let correct_password2 = false;
let correct_tel = false;
let numbers_in_password = 0;
let symbols_in_password = 0;

// проверочные данные
let english_symbols = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$%^&*()_+-=[]{}|.,`~§';
let numbers = '1234567890';

// поля для ввода данных
let tel_input = document.getElementById('tel');

let password_input = document.getElementById('password1');
let password_input2 = document.getElementById('password2');

let data_inputs = document.querySelectorAll('.data_input');
let data_inputs_containers = document.querySelectorAll('.input_container');

let submit_button = document.getElementById('submit_button');

let name_input = document.getElementsByName('name')[0];
let full_name_input = document.getElementsByName('full_name')[0];
let login_input = document.getElementsByName('login')[0];
let email_input = document.getElementsByName('email')[0];

// поля для вывода ошибок
let incorrect_name = document.getElementsByClassName('incorrect_text')[0];
let incorrect_full_name = document.getElementsByClassName('incorrect_text')[1];
let incorrect_login = document.getElementsByClassName('incorrect_text')[2];
let incorrect_email = document.getElementsByClassName('incorrect_text')[3];
let incorrect_password = document.getElementsByClassName('incorrect_text')[4];
let incorrect_password2 = document.getElementsByClassName('incorrect_text')[5];
let incorrect_tel = document.getElementsByClassName('incorrect_text')[6];

// фильтр для проверки валидности номера телефона
tel_input.addEventListener('input', function(){
    if(tel_input.value.length >= 1){
        tel_input.value = '+' + tel_input.value.replace(/\D/g, '');// удаление всего кроме цифр и авто добавление +
    }
    if(tel_input.value == '+' || tel_input.value == ' '){
        tel_input.value = '';// авто удаление пробелов и плюсов
    }
});

let eye_button = document.getElementById('eye_button');// кнопка видимости

// эффект при нажатии на поле ввода
for(let i = 0; i < data_inputs.length; i++){
    data_inputs[i].addEventListener('focus', function(){
        data_inputs_containers[i].setAttribute('class', 'active_input_container');
    });
    data_inputs[i].addEventListener('blur', function(){
        data_inputs_containers[i].setAttribute('class', 'input_container');
    });
}

//Видимость и невидимость пароля при вводе
eye_button.addEventListener('click', function(){
    if(password_input.getAttribute('type') == 'password'){
        eye_button.innerHTML = `
            <i class="far fa-eye-slash"></i>
        `;
        password_input.setAttribute('type', 'text');
        password_input2.setAttribute('type', 'text');   
    }else if(password_input.getAttribute('type') == 'text'){
        eye_button.innerHTML = `
            <i class="far fa-eye"></i>
        `;
        password_input.setAttribute('type', 'password');
        password_input2.setAttribute('type', 'password'); 
    }
});

form.addEventListener('submit', function(e){
    e.preventDefault();
    //ограничения для названия компании
    if(name_input.value == ''){
        incorrect_name.innerHTML = 'Введите название компании пожалуйста.';
        correct_name = false;
    }else if(name_input.value.length < 2){
        incorrect_name.innerHTML = 'Вы ввели слишком короткий название.';
        correct_name = false;
    }else{
        incorrect_name.innerHTML = '';
        correct_name = true;
    }
    //ограничения для полного названия компании
    if(full_name_input.value == ''){
        incorrect_full_name.innerHTML = 'Введите название компании пожалуйста.';
        correct_full_name = false;
    }else if(full_name_input.value.length < 2){
        incorrect_full_name.innerHTML = 'Вы ввели слишком короткий название.';
        correct_full_name = false;
    }else{
        incorrect_full_name.innerHTML = '';
        correct_full_name = true;
    }
    // ограничения для логина компании
    if(login_input.value == ''){
        incorrect_login.innerHTML = 'Введите логин компании пожалуйста.';
        correct_login = false;
    }else if(login_input.value.length < 2){
        incorrect_login.innerHTML = 'Вы ввели слишком короткий логин.';
        correct_login = false;
    }else if(login_input.value.indexOf(' ') != -1){
        incorrect_login.innerHTML = 'Логин не должен содержать пробелы. Вместо их может использовать "_".';
        correct_login = false;
    }else{
        for(let i = 0;i < login_input.value.length; i++){
            if(english_symbols.indexOf(login_input.value[i]) == -1 && numbers.indexOf(login_input.value[i]) == -1){
                console.log(login_input.value[i])
                incorrect_login.innerHTML = 'Логин должен содержать только латынские символы или цифры.';
                correct_login = false;
                break;
            }else{
                incorrect_login.innerHTML = '';
                correct_login = true;
            }
        }
    }
    // ограничения для электронной почты компании
    if(email_input.value == ''){
        incorrect_email.innerHTML = 'Введите электронную почту пожалуйста.';
        correct_email = false;
    }else if(email_input.value.indexOf('@') == 0 || email_input.value.indexOf('@') == email_input.value.length-1 || email_input.value.indexOf('@') == -1){
        incorrect_email.innerHTML = 'Не верный формат электронной почты.';
        correct_email = false;
    }else{
        incorrect_email.innerHTML = '';
        correct_email = true;
    }
    // ограничения для пароля
    symbols_in_password = 0;
    numbers_in_password = 0;
    if(password_input.value == ''){
        incorrect_password.innerHTML = 'Введите пароль пожалуйста.';
        correct_password = false;
    }else if(password_input.value.length < 6){
        incorrect_password.innerHTML = 'Вы ввели слишком короткий пароль.';
        correct_password = false;
    }else{
        for(let i = 0;i < password_input.value.length; i++){
            if(english_symbols.indexOf(password_input.value[i]) != -1){
                correct_password = false;
                symbols_in_password += 1;
            }
            if(numbers.indexOf(password_input.value[i]) != -1){
                correct_password = false;
                numbers_in_password += 1;
            }
        }
        if(numbers_in_password < 1){
            incorrect_password.innerHTML = 'В Вашем пароле должны быть цифры.';
            correct_password = false;
        }
        if(symbols_in_password < 1){
            incorrect_password.innerHTML = 'Пароль должен содержать латынские символы.';
            correct_password = false;
        }
        if(numbers_in_password >= 1 && symbols_in_password >= 1 && password_input.value.length >= 6){
            incorrect_password.innerHTML = '';
            correct_password = true;
        }
    }
    // ограничения для поворения пароля
    if(password_input2.value == ''){
        incorrect_password2.innerHTML = 'Повторите пароль пожалуйста.';
        correct_password2 = false;
    }else if(password_input2.value != password_input.value){
        incorrect_password2.innerHTML = 'Не верный пароль.';
        correct_password2 = false;
    }else{
        incorrect_password2.innerHTML = '';
        correct_password2 = true; 
    }
    // ограничения для номера телефона
    if(tel_input.value == ''){
        incorrect_tel.innerHTML = 'Введите пароль пожалуйста.';
        correct_tel = false;
    }else if(tel_input.value.indexOf('+') == -1){
        incorrect_tel.innerHTML = 'Не верный формат номера телефона.';
        correct_tel = false;
    }else{
        incorrect_tel.innerHTML = '';
        correct_tel = true;
    }

    // console.log(correct_name);
    // console.log(correct_full_name);
    // console.log(correct_login);
    // console.log(correct_email);
    // console.log(correct_password);
    // console.log(correct_password2);
    // console.log(correct_tel);

    if(correct_name && correct_full_name && correct_login && correct_email && correct_password && correct_password2 && correct_tel){
        let data = {
            'name': name_input.value,
            'full_name': full_name_input.value,
            'login': login_input.value,
            'email': email_input.value,
            'password': password_input.value,
            'tel': tel_input.value
        }
        fetch(registration_url, {method: 'POST', body: JSON.stringify(data)});
    }

});


61694e342cf05047512070.png
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 1
@TheSimonSays
Думаю, что проблема заключается в:
e.preventDefault();
Попробуйте отказаться от js.
Для таких целей лучше подойдет flask-wtf (https://flask-wtf.readthedocs.io/en/0.15.x/)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы