Skip to content

Реальный сайт на Flask с SQLAlchemy, PostgreSQL, Redis, Celery, Elasticsearch, OAuth 2.0, Pytest, Poetry, Docker

License

Notifications You must be signed in to change notification settings

IvanZaycev0717/mct-flask-sqlalchemy-redis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📒 Веб-приложение metacognitive-therapy.ru

anim
Веб-приложение metacognitive-therapy.ru - это уникальный онлайн-ресурс, созданный для тех, кто хочет абсолютно бесплатно получить знания, умения и навыки по соврменной когнитивной-поведенческий психотерапии 3 волны - метакогнитивной тепарии, разработанной профессором Манчестерского университета Эдрианом Уэллсом.

Миссия сайта:
На основе материалов сайта Вы сможете самостоятельно проработать свои психологические проблемы. Но если у Вас будет что-то не получаться Вы всегда можете через сайт записаться на индивидуальную консультацию к опытному метакогнитивному психотерапевту.

Что предлагает сайт:

  • Узнайте последние новости из мира психотерапии
  • Изучите новые статьи о новейших исследованиях в области психиатрии и психотерапии
  • Изучите новейший учебник метакогнитивной психотерапии, включающий следующие разделы:
    • Международная классификация болезней 11 пересмотра
    • Современная психофармакология
    • Немедикаментозные методы лечения психических расстройств
    • Метакогнитивная терапия
  • Задать любой вопрос на сайте, даже если вы не зарегистрированы и получить ответ от психотерапевта
  • Записаться на индивидуальную консультацию, если у Вас что-то не получается в процессе проработки психологических проблем
  • Зарегистрироваться на сайте через самые популярные социальные сети: ВКонтакте (VK), Одноклассники, через сервисы Google или Яндекс, а также через месседжер Telegram в один клик.
  • Регистрация позволяет:
    • Отмечать, какие статьи и главы учебника вы изучили. Изученные главы и статьи будут отображаться в статистике в Вашем личном кабинете.
    • В личном кабинете вы можете вести дневник состояний, который будет доступен только Вам. Если Вы брали индивидуальную консультацию Ваш дневник будет анализировать Ваш психотерапевт и давать рекомендации по лечению.

🎓 Технологии

Основные технологии

📗 Python 3.12
📗 Flask 3
📗 HTML, CSS, Bootsrap
📗 JavaScript (ES6)
📗 Адаптивная вёрстка
📗 SQLAlchemy 2.0
📗 PostgreSQL (production)
📗 SQLite (testing)
📗 Elasticsearch
📗 Регулярные выражения RegExp
📗 WYSIWYG-редактор
📗 Redis (cache server, message broker)
📗 Celery
📗 Pytest
📗 OAuth 2.0 (Google, VK, Одноклассники, Яндекс, Telegram)
📗 Google reCAPTCHA
📗 Poetry
📗 Логирование
📗 Docker
📗 (В production) Gunicorn
📗 (В production) CI/CD (GitHub Actions)
📗 (В production) nginx

Дополнения для Flask

📘 flask-migrate
📘 flask-wtf
📘 flask-login
📘 flask-mailman
📘 flask-admin
📘 flask-ckeditor
📘 flask-debugtoolbar
📘 flask-caching

Дополнительные библиотеки

📙 python-dotenv
📙 phonenumbers
📙 email-validator
📙 requests
📙 pyopenssl
📙 itsdangerous
📙 pillow
📙 mimesis
📙 psycopg2-binary

📄 Руководство по OAuth 2.0

В связи с тем, что авторизация через социальные сети Google, VK, Одноклассники, Яндекс и Telegram - это очень объёмная тема, я составил подробнейшее руководство по авторизации через эти сервисы. В данном руководстве я шаг за шагом объясняю, как реализовать OAuth 2.0, иллюстрируя каждый шаг.

Сайт Ссылка
yandex PDF-файл "Руководство по OAuth 2.0"

Также данное PDF-руководство доступно в корневой папке репозитория

🔒 Защиты сайта

Сайт является полностью безопасным и был протестирован различными методами: от мануального тестирования до автотестов, написанных на pytest.

Защита от: Описание
XSS-атак Шаблоны Jinja2, используемые в Flask, автоматически экранируют выводимые данные, что предотвращает выполнение вредоносного JavaScript-кода.
CSRF-атак Включена защита от межсайтовых запросов (CSRF) с помощью расширения Flask-WTF, которое автоматически добавляет CSRF-токены в формы.
SQL-инъекций Все запросы в базу данных являются параметризированными. Все входные данные тщательно проверяются и очищаются, чтобы предотвратить SQL-инъекции и другие атаки, связанные с некорректными данными.
Защита от спама Используется самая последняя версия reCAPTCHA 3 от Goggle
Незашифрованные данные Все соединения с сайтом защищены с помощью HTTPS, что обеспечивает шифрование данных между клиентом и сервером
Кража данных сессии Используется безопасное управление сессиями, что включает шифрование данных сессии и настройку таймаутов
DDoS-атаки Осуществляется на уровне хостинга
Пользователи, нарушающие законодательство РФ Сайтом предусмотрена блокировка пользователя по IP-адресу

🚀 Оптимизация сайта

Для работы сайта была произведена минимизация времени отклика для пользователя с помощью следующих действий:

  1. Выбор правильной схемы базы данных для минимизации запросов
  2. Использование самых ограничительных критериев для фильтрации данных при выполнении запроса
  3. Индексация полей, где используются операторы WHERE, ORDER BY, JOIN
  4. Выбор PostgreSQL 16 с эффективным оптимизатором запросов, выбирающий план выполнения с наименьшей стоимостью запроса
  5. Минимизация запросов с помощью Flask Debug Toolbar - там, где возможно, "ленивая" загрузка (lazy loading) была заменена на "жадную" загрузку (eager loading)
  6. Кеширование страниц и возвращаемых данных функций с помощью NoSQL СУБД Redis
  7. При отправке письма происходит обход глобальной блокировки интерпритатора Python (GIL) с помощью использования брокера сообщений Redis и асинхронной очереди Celery
  8. Для полнотекстового поиска использована технология Elasticsearch, которая позволяет не сканировать полностью базу данных сайта.
  9. (В production) Использована многопроцессность для WSGI-сервера gunicorn
  10. (В production) Произведена тонкая настройка сервера nginx

📰 ER-диаграмма базы данных

В результате анализа требований и структуры данных, была выбрана наиболее оптимальная ER-диаграмма, которая обеспечивает эффективное взаимодействие между сущностями. Этот подход позволяет минимизировать избыточность данных и улучшить производительность запросов в базе данных. er

💻 Запуск на локальном компьютере

В данном репозитории представлена публичная версия сайта для ознакомления с основными возможностями. Все данные представленные в файле .env.example являются публичными и не представляют никакой тайны.

В production используется приватная версия сайта со своим файлом .env, в котором содержатся секретные данные. Приватная версия сайта доступна только создателю сайта и находится в специальном приватном репозитории.

🐳 Установка с помощью Docker

  1. Установите и запустите Docker engine на вашем компьюетере

  2. Убедитесь, что Docker engine запущен

docker info
  1. Клонируйте репозиторий на локальный компьютер по SSH-протоколу
git clone [email protected]:IvanZaycev0717/mct-flask-sqlalchemy-redis.git

Если у вас нет ключа SSH, то скачайте с GitHub архив в формате zip.

https://github.com/IvanZaycev0717/mct-flask-sqlalchemy-redis/archive/refs/heads/main.zip

Распакуйте в выбранную директорию этот архив.

  1. Перейдите в директорию с проектом на своей локальном компьютере
cd <путь к директории с проектом>
  1. Переименуйте .env.example в .env

  2. Откройте файл .env и измените электронную почту администратора на свою:

Далее, если требуется, установите свои параметры конфигурации Redis

# Redis setup
BROKER_URL=redis://redis:6379
RESULT_BACKEND=redis://redis:6379
REDIS_URL=redis://redis:6379
REDIS_PASSWORD=your_redis_password

Сохраните этот файл

  1. Выполнитете команду создания и запуска контейнеров в фоновом режиме
docker compose up -d

Дождитесь пока база данных будет создана и в логах контейнера mct-app будут пройдены все тесты

  1. Откройте браузер и перейдите на адрес
https://127.0.0.1/
  1. Обойдите предупреждение "Подключение не защищено" перейдя в "Дополнительно" и открыть сайт.
  2. Можете начинать пользоваться сайтом от имени администратора
  • Имя пользователя: admin
  • Пароль: 1234

🧙 Автор

Иван Зайцев,
Full Stack Developer (Python Backend Developer + Frontend Developer)
©2024

About

Реальный сайт на Flask с SQLAlchemy, PostgreSQL, Redis, Celery, Elasticsearch, OAuth 2.0, Pytest, Poetry, Docker

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published