Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
18.01.2024
Размер:
6.95 Кб
Скачать
# Стандартные библиотеки
import os
import re
import json

# Библиотека pymysql для подключения к MYSQL
import pymysql

# Библиотека flask для создания запросов к веб-серверу
from flask import Flask, render_template, request


app = Flask(__name__, template_folder='C:\\Users\\Morze\\Desktop\\Web\\site_mtuci\\')


def get_config_connect() -> dict:
    """
    Получение конфига для БД
    :return:
    """
    json_path = os.path.dirname(os.path.abspath(__file__))
    with open(rf'{json_path}\Config.json', encoding='utf8') as f:
        file_content = f.read()
        params = json.loads(file_content)
        f.close()
        config = params["Database"]
    return config


config = get_config_connect()


@app.route("/", methods=['POST', 'GET'])
def home():
    return render_template("vxod.html")


@app.route('/site_data/', methods=['POST', 'GET'])
def login() -> None:
    """
    Авторизация пользователя
    :return: None
    """
    # Получение переменных из HTML формы регистрации
    email = request.form['email']
    password = request.form['psw']
    print(email)
    print(password)
    # Подлкючение к БД Mysql
    connection = pymysql.connect(**config, cursorclass=pymysql.cursors.DictCursor, charset='utf8', use_unicode=True)
    with connection.cursor() as cursor:
        """При передачи такого sql запроса возможна sql-инъекция"""
        select_movies_query = "SELECT * FROM users WHERE email = '" + email + "' AND password = '"+ password +"'"
        cursor.execute(select_movies_query)
        result = cursor.fetchall()
        print(result)
        # Проверка сущетсвования пользователя в БД
        if not result:
            print("Кортеж пустой")
            error = "Такого пользователя не существует"
            return render_template("vxod.html", error=error)
            # return flask.flash("Идиот", category='message')
        n = 0
        number_row = 0
        for row in result:
            print(row)
            if row["email"] == email:
                number_row = n
            n += 1

        key_privilege = "privilege"
        privilege = result[number_row][key_privilege]
        print(number_row)
        print(privilege)
        cursor.close()

        # Проверка привелегий, если значение 1 то админ сайт, иначе открывается обычный сайт
        match privilege:
            case 1:
                print("Админ сайт")
                print(privilege)
                return render_template("siteadmin.html")
            case 2:
                print("Основной сайт")
                print(privilege)
                return render_template("site.html")
            case _:
                print("Основной сайт")
                print(privilege)
                return render_template("site.html")

@app.route('/registration_data/vxod.html')
@app.route('/site_data/vxod.html')
def vxod_html_win():
    return render_template("vxod.html")


@app.route('/registration_data/', methods=['POST', 'GET'])
def registration() -> None:
    """
    Регистрация пользователя
    :return: None
    """
    # Получение переменных из HTML формы регистрации
    email = request.form['email']
    password = request.form['psw']
    password_repeat = request.form['psw-repeat']

    # Проверка email на правильность
    if not re.match(r"^((([0-9A-Za-z]{1}[-0-9A-z\.]{0,30}[0-9A-Za-z]?)|([0-9А-Яа-я]{1}[-0-9А-я\.]{0,30}[0-9А-Яа-я]?))@([-A-Za-z]{1,}\.){1,}[-A-Za-z]{2,})$",
                email):
        print(f"eror email {email}")
        error_email = "Введите корректный email"
        return render_template("registration.html", error=error_email)

    # Проверка совпадения паролей
    if password != password_repeat:
        print("Пароли неправильные")
        error_repeat = "Введённые пароли не совпадают"
        return render_template("registration.html", error=error_repeat)

    # Проверка на защищенный пароль он должен быть 8 символов и содержать верхний, нижний регистр, цифры и спец.сим.
    if not re.match(r"((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,})", password):
        print("Пароль слабый")
        error_weak_password = "Слабый пароль (не короче 8 букв и цифр, а также спецсимволы. Не используйте личные данные, последовательности (123456, qwerty) и популярные пароли (password)"
        return render_template("registration.html", error=error_weak_password)

    # Подлкючение к БД Mysql
    connection = pymysql.connect(**config, cursorclass=pymysql.cursors.DictCursor, charset='utf8', use_unicode=True)
    with connection.cursor() as cursor:
        select_movies_query = "SELECT * FROM users WHERE email = '" + email + "'"
        cursor.execute(select_movies_query)
        result = cursor.fetchall()
        # Проверка есть ли такой пароль и логин в БД
        if result:
            print("Кортеж не пустой")
            print("Есть такой аккаунт в БД")
            error_have_user = "Такой аккаунт уже был зарегестрирован"
            return render_template("registration.html", error=error_have_user)
            cursor.close()
            
        # Запись в БД нового пользователя
        else:
            privilege = 2
            select_insert = "INSERT INTO users (email, password, privilege) VALUES (%s,%s,%s)"
            val = (email, password, privilege)
            cursor.execute(select_insert, val)
            connection.commit()
            print("Регистрация завершена")
            cursor.close()
            return render_template("site.html")


@app.route('/registration_data/registration.html')
@app.route('/registration.html')
@app.route('/site_data/registration.html')
def registration_site_html_win():
    return render_template("registration.html")


if __name__ == '__main__':
    # Библиотека waitress для создания веб-сервера
    from waitress import serve
    serve(app, host="127.0.0.1", port=8080)
Соседние файлы в папке Python