| Cutelyst web framework |
|
| Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Cutelyst [1] — это высокопроизводительный веб-фреймворк на C++, построенный поверх библиотеки Qt. Он вдохновлён подходом веб-фреймворка Catalyst (Perl) и предлагает интересную концепцию: возможность использовать один и тот же C++/Qt код как для настольных/мобильных приложений, так и для веб-приложений. API у Cutelyst очень похож на API Perl Catalyst. [Ключевые концепции и философия] Основная идея Cutelyst — повторное использование кода. Если вы уже разрабатываете приложения на C++/Qt для Windows, Linux, macOS, Android или iOS, вы можете задействовать ту же кодовую базу для создания веб-версии вашего продукта. Это позволяет: - Сократить количество команд разработки — не нужно держать отдельные команды для разных платформ. Фреймворк использует метаобъектную систему Qt для интроспекции методов контроллеров и автоматической генерации соответствующих action-методов. [Технические возможности] Сетевые протоколы и сервер. Cutelyst включает встроенный кроссплатформенный сервер Cutelyst::Server, который поддерживает: - HTTP/1.1 — конвейеризация и Keep-Alive. Сервер может работать как самостоятельно, так и за прокси-сервером (Apache, nginx) через UNIX-сокеты. Cutelyst поддерживает систему диспечеризации, request/response API, плагины придерживаются концепции Model/View/Controller (MVC), поддерживающей переиспользование кода. [Архитектура] Фреймворк построен вокруг следующих ключевых компонентов:
Шаблоны и представления. Cutelyst поддерживает несколько систем шаблонов через плагины: - Cutelee — Qt-реализация шаблонизатора Django [Готовая функциональность (плагины)] Из коробки доступно множество плагинов, закрывающих типовые задачи веб-разработки: - Сессии (Session) — управление пользовательскими сессиями. На официальной странице документации также упоминается интеграция с TOML-конфигурациями — можно загружать настройки из TOML-файлов с помощью `app.config()->loadFromFile('config.toml')`. [Производительность и эффективность] Одно из главных преимуществ Cutelyst — низкое потребление ресурсов. По заявлениям разработчиков, полноценная CMS на Cutelyst занимает около 5 МБ оперативной памяти, которая может разделяться между разными экземплярами приложения. Это достигается благодаря: - Компилируемому C++ коду (вместо интерпретируемых языков) Для асинхронной обработки предусмотрен класс ASync, однако документация предупреждает: не стоит использовать локальные QEventLoops, это может привести к падению. [Установка и требования] Минимальные требования: - CMake ≥ 3.9 Опционально: - uWSGI ≥ 1.9 Процесс сборки: mkdir build && cd build Для запуска приложения используется утилита cutelystd5-qt6 (или cutelyst5-qt6 для разработки): cutelystd5-qt6 -M --lazy -a /path/to/cutelystapp.so --h1 localhost:3000 [Достоинства и недостатки] Плюсы Cutelyst: ● Высокая производительность и малое потребление памяти (единицы мегабайт ОЗУ) Минусы Cutelyst: ● Маленькое сообщество — нишевый фреймворк, найти готовые решения и помощь сложнее, чем у Django, Laravel или Express. Для каких проектов подходит. Идеальный сценарий использования: - У вас уже есть C++/Qt приложение, и вы хотите добавить к нему веб-интерфейс. Стоит рассмотреть альтернативы, если: - Вам нужна огромная экосистема пакетов и готовых решений (тогда лучше Django/Node.js). Cutelyst — образцово нишевый фреймворк. Он отлично решает конкретную задачу: дать возможность C++/Qt разработчикам создавать производительные веб-приложения, переиспользуя существующий код. Если вы уже в экосистеме Qt — Cutelyst станет естественным и мощным продолжением вашего инструментария. Если же вы ищете mainstream-решение с огромным сообществом — стоит посмотреть в сторону более популярных фреймворков. Q01. Зачем было писать еще один web-фреймворк? Q02. Почему именно C++/Qt? Q03. Cutelyst включает использование собственного HTTP-сервера? Q04. Требуется ли писать HTML-код в C/C++? Q05. Насколько хорошо это работает? https://www.techempower.com/benchmarks Хотя производительность довольно сложно измерить правильно, обычный результат - уменьшение расхода RAM в 8 раз и снижение задержки обработки запросов с 18 до 2 миллисекунд. Поскольку расход ресурсов приложения получается намного меньше, у вас появляется больше свободы на встраивание ваших шаблонов и порождение большего количества потоков [4]. Q06. Включает ли Cutelyst ORM базы данных? Примечание: ORM (Object-Relational Mapping) это технология программирования, которая позволяет работать с данными в реляционной базе данных (SQL), используя объекты языка программирования, вместо того чтобы писать прямые SQL-запросы. Простыми словами, ORM — это переводчик между миром объектов (в коде) и миром таблиц (в базе данных). Cutelyst строится на Qt, а в экосистеме Qt уже есть несколько попыток создать полноценный ORM (объектно-реляционное отображение). Разработчики справедливо рассуждают: зачем писать свой с нуля, когда можно взять один из существующих и интегрировать его через обычные C++/Qt механизмы? Это позволяет пользователю самому выбрать инструмент под свою задачу. Однако у этого подхода есть и обратная сторона медалиВ отличие от фреймворков с «батарейками в комплекте» (как Django), Cutelyst не предоставляет готовой, протестированной и задокументированной интеграции ни с одним из ORM. Вы сами должны выбрать ORM, подключить его к проекту (через CMake), написать код для работы с БД, и обеспечить его взаимодействие с контекстом Cutelyst (например, передавать соединение с БД в контроллеры). https://github.com/HamedMasafi/Nut Q07. Для каких приложений предназначен Cutelyst - на стороне WEB-сервера или на стороне клиента (WEB-браузера)? Cutelyst создан для того, чтобы на C++ и Qt писать серверную логику веб-приложений. Он обрабатывает HTTP-запросы, взаимодействует с базами данных и генерирует ответ. В официальной документации Cutelyst прямо назван "C++ Web Framework built on top of Qt" (Веб-фреймворк на C++, построенный поверх Qt). SourceForge также подтверждает это: Cutelyst помогает создавать "быстрые и современные веб-приложения". Что делает Cutelyst как backend-фреймворк: ● Принимает входящие HTTP-запросы: серверная часть обрабатывает запросы от браузеров и других клиентов. Пример из официального руководства показывает, как Cutelyst обрабатывает POST-запросы для создания пользователей и сообщений, что является классической серверной задачей. [Генерация HTML vs. REST API] Cutelyst предоставляет инструменты для двух основных подходов к созданию веб-приложений. Выбор между ними зависит от того, что именно вы хотите делать на стороне клиента:
[Как запустить серверное приложение на Cutelyst] Для запуска вашего Cutelyst-приложения используется специальная утилита cutelystd5-qt6. Она поднимает HTTP/HTTPS сервер, который может работать как самостоятельно, так и за прокси-сервером (например, Apache или nginx) . Пример запуска сервера: # Запуск приложения на HTTP порту 3000 `-a` указывает путь к скомпилированной библиотеке вашего приложения, а `--h1` включает HTTP сервер. Уникальность Cutelyst в том, что он позволяет переиспользовать C++/Qt код между серверной частью веб-приложения и нативными десктопными или мобильными приложениями. Это его главное преимущество. Например, вы можете написать логику расчетов на C++ и использовать её как в настольной программе, так и на сервере, обрабатывающем веб-запросы. Но сам Cutelyst (как библиотека) выполняется именно на сервере, а не на клиенте. [Что такое CSRF-атака] CSRF (Cross-Site Request Forgery) — тип атаки, при котором злоумышленник заставляет браузер аутентифицированного пользователя выполнить нежелательное действие на доверенном веб-сайте. Как работает атака. CSRF-атака становится возможной из-за того, что браузеры автоматически отправляют сохранённые куки (включая сессионные) при каждом запросе к соответствующему домену. Классическая схема атаки выглядит так: 1. Пользователь входит на сайт (например, интернет-банк) и получает аутентификационную куку. Важно понимать: CSRF нацелена на запросы, изменяющие состояние (POST, PUT, DELETE). Злоумышленник не может украсть данные, потому что не видит ответ сервера — он только инициирует действие. Пример GET-атаки: < !-- Вредоносный сайт может разместить такое изображение --> < img src="https://bank.com/transfer.do?acct=HACKER&amount=100000" width="0" height="0"> Браузер жертвы загрузит эту "картинку" и выполнит перевод денег без какого-либо визуального уведомления. [Реализация защиты в Cutelyst] Cutelyst предоставляет готовый плагин CSRFProtection, который реализует паттерн синхронизатора токенов (Synchronizer Token Pattern). Подключение плагина. Плагин не включён по умолчанию — его нужно явно активировать при сборке фреймворка: # При сборке Cutelyst из исходников Базовое использование: 1. Подключаем плагин в приложении: #include < Cutelyst/Plugins/CSRFProtection/CSRFProtection> 2. Исключаем отдельные действия (если нужно): Если нужно отключить защиту для конкретного действия (например, для публичного API без сессий), используется атрибут `:CSRFIgnore` : C_ATTR(webhook, :Path :AutoArgs :CSRFIgnore)void webhook(Context *c); 3. Принудительно включаем защиту для действия в исключённом пространстве имён: Если вы исключили целое пространство имён (`setIgnoredNamespaces({"foo"})`), но хотите защитить конкретное действие, используйте :CSRFRequire: class Foo : public Cutelyst::Controller { [Работа с шаблонами Cutelee] В HTML-форму нужно добавить скрытое поле с CSRF-токеном. Для этого в шаблонах Cutelee используется специальный тег: < form method="post" action="/submit">
{% c_csrf_token %}
< input type="text" name="username">
< input type="password" name="password">
< button type="submit">Отправить</button>
< /form>
Тег {% c_csrf_token %} автоматически вставляет скрытое поле input с корректным значением токена. [Работа с AJAX] Для AJAX-запросов токен можно передавать двумя способами: 1. Через HTTP-заголовок `X-CSRFToken` (рекомендуется для JavaScript-фреймворков): fetch('/api/transfer', { 2. Через мета-тег в HTML и чтение из DOM (html): < meta name="csrf-token" content="{{ csrf_token }}"> javascript: const token = document.querySelector('meta[name="csrf-token"]').content; Для получения токена в коде используется статический метод: QString token = CSRFProtection::getToken(c); [Настройка плагина] Плагин поддерживает конфигурацию через файл настроек приложения (секция Cutelyst_CSRFProtection_Plugin):
Пример конфигурации: [Cutelyst_CSRFProtection_Plugin] [Обработка ошибок проверки] Если проверка CSRF не проходит: 1. Сервер возвращает статус 403 Forbidden. 2. В "stash" (хранилище контекста) устанавливается сообщение об ошибке. 3. Можно настроить действие для перенаправления при ошибке: auto csrf = new CSRFProtection(this); Также можно указать действие для конкретного метода с помощью атрибута: C_ATTR(transfer, :Local :CSRFDetachTo(transferDenied)) [Важные ограничения] Разработчики Cutelyst особо отмечают одну уязвимость: поддомены могут обходить защиту CSRF. Если у вас есть поддомен (например evil.example.com) и он может устанавливать куки для основного домена .example.com, то этот поддомен сможет подделать токен и обойти защиту. Решение: доверяйте поддомены только надёжным пользователям или приложениям. [Принцип работы (как это устроено внутри)] Плагин CSRFProtection работает по следующему алгоритму: 1. На каждом запросе генерируется секретный токен (с солью). Этот механизм гарантирует, что злоумышленник, не имеющий доступа к куке и не могущий предугадать случайный токен, не сможет сформировать легитимный поддельный запрос. [Ссылки] 1. cutelyst / cutelyst. |