From aea18b8a9d24b4b236c1914d0ee67875117ccead Mon Sep 17 00:00:00 2001 From: dr_domi Date: Thu, 6 Nov 2025 11:51:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auth.py | 196 +++++++++++++++++++++++++++++++++++++++++++++++ help.md | 75 ++++++++++++++++++ link.txt | 3 + main.py | 25 ++++++ requirements.txt | 4 + 5 files changed, 303 insertions(+) create mode 100644 auth.py create mode 100644 help.md create mode 100644 link.txt create mode 100644 main.py create mode 100644 requirements.txt diff --git a/auth.py b/auth.py new file mode 100644 index 0000000..c722984 --- /dev/null +++ b/auth.py @@ -0,0 +1,196 @@ +# auth.py +""" +Основной модуль системы авторизации +""" +from flask import Flask, request, jsonify +from flask_cors import CORS +from typing import Dict, Any +import database +import validators +from config import DEBUG_MODE + + +def debug_log(message: str) -> None: + """Вывод отладочных сообщений""" + if DEBUG_MODE: + print(f"[DEBUG] {message}") + + +# Инициализация Flask приложения +app = Flask(__name__) +CORS(app) # Разрешаем CORS для Vue/React + +# Инициализация базы данных при запуске +database.init_database() + + +@app.route('/api/register', methods=['POST']) +def register() -> Dict[str, Any]: + """ + Эндпоинт регистрации нового пользователя + + Ожидаемые данные (JSON): + { + "username": "user_login", + "password": "user_password", + "password_confirm": "user_password" + } + + Возвращает (JSON): + { + "success": true/false, + "message": "сообщение", + "errors": {...} # при наличии ошибок валидации + } + """ + debug_log("=== Запрос на регистрацию ===") + + try: + data = request.get_json() + debug_log(f"Получены данные: username={data.get('username')}") + + username = data.get('username', '').strip() + password = data.get('password', '') + password_confirm = data.get('password_confirm', '') + + errors = {} + + # Валидация логина + is_valid_username, username_error = validators.validate_username(username) + if not is_valid_username: + errors['username'] = username_error + + # Валидация пароля + is_valid_password, password_error = validators.validate_password(password) + if not is_valid_password: + errors['password'] = password_error + + # Проверка совпадения паролей + is_passwords_match, match_error = validators.validate_password_confirmation( + password, password_confirm + ) + if not is_passwords_match: + errors['password_confirm'] = match_error + + # Если есть ошибки валидации + if errors: + debug_log(f"Ошибки валидации: {errors}") + return jsonify({ + 'success': False, + 'message': 'Ошибки валидации данных', + 'errors': errors + }), 400 + + # Создание пользователя + success, message = database.create_user(username, password) + + if success: + debug_log("Регистрация завершена успешно") + return jsonify({ + 'success': True, + 'message': message + }), 201 + else: + debug_log(f"Ошибка регистрации: {message}") + return jsonify({ + 'success': False, + 'message': message + }), 400 + + except Exception as e: + debug_log(f"Необработанная ошибка: {e}") + return jsonify({ + 'success': False, + 'message': 'Внутренняя ошибка сервера' + }), 500 + + +@app.route('/api/login', methods=['POST']) +def login() -> Dict[str, Any]: + """ + Эндпоинт входа пользователя + + Ожидаемые данные (JSON): + { + "username": "user_login", + "password": "user_password" + } + + Возвращает (JSON): + { + "success": true/false, + "message": "сообщение", + "user": {...} # данные пользователя при успехе + } + """ + debug_log("=== Запрос на вход ===") + + try: + data = request.get_json() + debug_log(f"Получены данные: username={data.get('username')}") + + username = data.get('username', '').strip() + password = data.get('password', '') + + errors = {} + + # Валидация логина + is_valid_username, username_error = validators.validate_username(username) + if not is_valid_username: + errors['username'] = username_error + + # Валидация пароля + is_valid_password, password_error = validators.validate_password(password) + if not is_valid_password: + errors['password'] = password_error + + # Если есть ошибки валидации + if errors: + debug_log(f"Ошибки валидации: {errors}") + return jsonify({ + 'success': False, + 'message': 'Ошибки валидации данных', + 'errors': errors + }), 400 + + # Проверка учетных данных + success, message = database.verify_user(username, password) + + if success: + debug_log("Вход выполнен успешно") + return jsonify({ + 'success': True, + 'message': message, + 'user': { + 'username': username + } + }), 200 + else: + debug_log(f"Ошибка входа: {message}") + return jsonify({ + 'success': False, + 'message': message + }), 401 + + except Exception as e: + debug_log(f"Необработанная ошибка: {e}") + return jsonify({ + 'success': False, + 'message': 'Внутренняя ошибка сервера' + }), 500 + + +@app.route('/api/health', methods=['GET']) +def health_check(): + """Проверка работоспособности API""" + return jsonify({ + 'status': 'ok', + 'message': 'API работает' + }), 200 + + +if __name__ == '__main__': + debug_log("=== Запуск сервера авторизации ===") + debug_log(f"DEBUG_MODE: {DEBUG_MODE}") + app.run(debug=DEBUG_MODE, host='0.0.0.0', port=5000) + diff --git a/help.md b/help.md new file mode 100644 index 0000000..cc78fca --- /dev/null +++ b/help.md @@ -0,0 +1,75 @@ +'''Это копипаста из перплексити, чтобы можно было потестить API без фронтенда. В целом всё работает, и даже очень хорошо работает''' + +Установите зависимости: + +```bash +pip install -r requirements.txt +``` + +Запустите бэкенд-сервер: + +```bash +python auth.py +``` +Сервер запустится на http://localhost:5000.​ + + +Тестирование API +Вы можете протестировать API с помощью curl, Postman или прямо из браузера: + +Проверка работоспособности: + +```bash +curl http://localhost:5000/api/health +``` + +Регистрация: + +```bash +curl -X POST http://localhost:5000/api/register \ + -H "Content-Type: application/json" \ + -d '{"username":"testuser","password":"Test123456","password_confirm":"Test123456"}' +``` + +Вход: + +```bash +curl -X POST http://localhost:5000/api/login \ + -H "Content-Type: application/json" \ + -d '{"username":"testuser","password":"Test123456"}' +``` + +Примеры ответов API +Успешная регистрация: + +```json +{ + "success": true, + "message": "Регистрация успешна" +} +``` + +Ошибка валидации: + +```json +{ + "success": false, + "message": "Ошибки валидации данных", + "errors": { + "username": "Логин должен содержать минимум 4 символа", + "password": "Пароль должен содержать минимум 8 символов, латинские буквы и цифры" + } +} +``` + +Успешный вход: + +```json +{ + "success": true, + "message": "Вход выполнен успешно", + "user": { + "username": "testuser" + } +} +``` \ No newline at end of file diff --git a/link.txt b/link.txt new file mode 100644 index 0000000..d440863 --- /dev/null +++ b/link.txt @@ -0,0 +1,3 @@ +https://www.perplexity.ai/spaces/tbcmap-GaQAgp1FQ5W.SaTuw2POrw#0 + +'''Это ссылка на пространство перплексити, где я буду писать код и планировать структуру проекта''' \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..46299a3 --- /dev/null +++ b/main.py @@ -0,0 +1,25 @@ +# main.py +""" +Основное окно приложения (шаблон) +Будет открываться после успешной авторизации +""" + + +def main_window(): + """ + Главное окно приложения + Здесь будет основная функциональность вашего приложения + """ + print("=" * 50) + print("ДОБРО ПОЖАЛОВАТЬ В ГЛАВНОЕ ОКНО ПРИЛОЖЕНИЯ") + print("=" * 50) + print("\nЗдесь будет основной функционал приложения") + print("Это окно открывается после успешной авторизации\n") + + # Здесь можно добавить основную логику приложения + # Например, меню, функции работы с данными и т.д. + + +if __name__ == '__main__': + main_window() + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1a58f9c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +Flask==3.0.0 +Flask-CORS==4.0.0 +bcrypt==4.1.2 +