Публичный интерфейс библиотеки winow-view
Модули
- View - фасад: заголовки htmx, экранирование, статика, создание объектов
Классы
- ViewRenderer - рендеринг фрагментов и страниц через JinjOS
- CsrfGuard - защита форм от подделки межсайтового запроса
Класс CsrfGuard
Защита форм от подделки межсайтового запроса (CSRF).
Токен не хранится на сервере: он состоит из метки времени и HMAC-SHA256 от секрета по паре «метка времени плюс идентификатор сессии». Проверка - это пересчёт подписи, поэтому схема переживает перезапуск приложения и работает при нескольких рабочих процессах без общего хранилища.
Токен привязан к сессии: выданный одному посетителю не подойдёт другому. И ограничен по времени: подсмотренный однажды перестаёт работать.
Защита = View.СоздатьЗащитуCSRF(ПолучитьПеременнуюСреды("APP_SECRET"));
// то же самое напрямую
Защита = Новый CsrfGuard(ПолучитьПеременнуюСреды("APP_SECRET"));Конструктор
Новый CsrfGuard(Знач Секрет, Знач СрокЖизни = 3600)| Параметр | Тип | Описание |
|---|---|---|
Секрет | Строка | Секрет приложения. Одинаковый у всех рабочих процессов, разный в разных окружениях |
СрокЖизни | Число | Срок жизни токена в секундах |
Пустой секрет и неположительный срок жизни дают исключение: это ошибки настройки приложения, а не внештатные ситуации во время работы. Секрет в исходный код не помещается.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
СрокЖизниТокена | Число | Срок жизни токена в секундах |
Методы
| Метод | Возвращает | Назначение |
|---|---|---|
СоздатьТокен | Строка | Токен для сессии |
ПроверитьТокен | Булево | Проверка токена |
ПолеФормы | Строка | Готовое скрытое поле формы |
ИмяПоля | Строка | _csrf |
ИмяЗаголовка | Строка | X-CSRF-Token |
ТокенИзЗаголовков | Строка | Токен из заголовков запроса |
СоздатьТокен
Функция СоздатьТокен(Знач ИдентификаторСессии, Знач МеткаВремени = Неопределено) ЭкспортВыдаёт токен для сессии.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
ИдентификаторСессии | Строка | Идентификатор сессии посетителя |
МеткаВремени | Число | Время выдачи в секундах Unix. По умолчанию текущее время |
Возвращаемое значение: Строка - токен вида <метка времени>.<подпись>.
Пустой идентификатор сессии даёт исключение: токен без привязки к сессии не защищает ни от чего. Явная метка времени делает выдачу и проверку воспроизводимыми - это нужно в тестах и при разборе инцидентов.
Токен = Защита.СоздатьТокен(Запрос.Сессия.Идентификатор());
// 1785876773.940be1dbf278fd7cfd73657aab5195d8882616282dd36368527a4965f5a55e97ПроверитьТокен
Функция ПроверитьТокен(Знач Токен, Знач ИдентификаторСессии, Знач ТекущаяМетка = Неопределено) ЭкспортПроверяет токен. Не выбрасывает исключений: любое неожиданное значение - это просто непройденная проверка.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
Токен | Строка | Проверяемый токен |
ИдентификаторСессии | Строка | Идентификатор сессии посетителя |
ТекущаяМетка | Число | Время проверки в секундах Unix. По умолчанию текущее время |
Возвращаемое значение: Булево - Истина, если токен выдан этой сессии и не истёк.
Проверка не проходит, если токен пустой или не строка, нет разделителя, метка времени не из цифр или длиннее 12 символов, метка из будущего, срок жизни истёк, подпись не совпала, идентификатор сессии пустой.
Подписи сравниваются за постоянное время, поэтому по длительности проверки подпись не подобрать. Метку ставит сервер по своим часам, поэтому токен из будущего считается поддельным.
Токен = Запрос.ПараметрыИменные[Защита.ИмяПоля()];
Если Не Защита.ПроверитьТокен(Токен, Запрос.Сессия.Идентификатор()) Тогда
Ответ.УстановитьСостояние(403);
Возврат;
КонецЕсли;ПолеФормы
Функция ПолеФормы(Знач ИдентификаторСессии) ЭкспортГотовое скрытое поле формы с токеном. Значения экранируются, поле вставляется в шаблон как есть.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
ИдентификаторСессии | Строка | Идентификатор сессии посетителя |
Возвращаемое значение: Строка - разметка input type="hidden".
Модель.Вставить("ПолеCSRF", Защита.ПолеФормы(Запрос.Сессия.Идентификатор()));<form hx-post="/задачи">
{{ Модель.ПолеCSRF }}
<input name="название">
</form>ИмяПоля
Функция ИмяПоля() ЭкспортВозвращаемое значение: Строка - _csrf. Имя поля формы, в котором ожидается токен.
Токен = Запрос.ПараметрыИменные[Защита.ИмяПоля()];ИмяЗаголовка
Функция ИмяЗаголовка() ЭкспортВозвращаемое значение: Строка - X-CSRF-Token. Имя заголовка, в котором ожидается токен.
Для запросов htmx токен удобно передавать заголовком сразу для всех форм страницы:
<body hx-headers='{"X-CSRF-Token": "{{ Модель.ТокенCSRF }}"}'>ТокенИзЗаголовков
Функция ТокенИзЗаголовков(Знач Заголовки) ЭкспортИзвлекает токен из заголовков запроса независимо от регистра имени.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
Заголовки | Соответствие, Структура | Заголовки запроса |
Возвращаемое значение: Строка - значение заголовка либо пустая строка.
Если Не Защита.ПроверитьТокен(Защита.ТокенИзЗаголовков(Запрос.Заголовки), Сессия.Идентификатор()) Тогда
Ответ.УстановитьСостояние(403);
КонецЕсли;Смотри также
Класс ViewRenderer
Рендеринг HTML через шаблонизатор JinjOS.
Ключевой сценарий htmx: один обработчик отвечает фрагментом на hx-запрос и целой страницей на обычный переход по ссылке.
Отображения = View.СоздатьОтображения("шаблоны", Новый Структура("Макет", "макет"));
// то же самое напрямую
Отображения = Новый ViewRenderer("шаблоны", Новый Структура("Макет", "макет"));Конструктор
Новый ViewRenderer(Знач Каталог, Знач Параметры = Неопределено)| Параметр | Тип | Описание |
|---|---|---|
Каталог | Строка | Каталог с файлами шаблонов. Пустое значение даёт исключение |
Параметры | Структура, Соответствие | Настройки |
Настройки:
| Параметр | По умолчанию | Описание |
|---|---|---|
КэшироватьШаблоны | Истина | Хранить скомпилированные шаблоны в памяти |
Расширение | ".html" | Дописывается к имени шаблона без расширения |
Макет | "" | Макет по умолчанию для метода Страница |
ПлейсхолдерКонтента | "@Контент" | Место вставки содержимого в макет, та же метка, что использует winow |
ПутьКJinjOS | - | Путь к файлу src/Классы/Шаблон.os пакета JinjOS, если он установлен нестандартно |
На время разработки кэш выключают, чтобы правки шаблонов подхватывались без перезапуска сервера.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
КаталогШаблонов | Строка | Полный путь к каталогу шаблонов |
МакетПоУмолчанию | Строка | Макет, применяемый методом Страница без явного указания |
Синтаксис шаблонов
{{ Модель.Поле }} подставляет значение, {% ... %} вставляет код OneScript.
<ul id="задачи">
{% Для Каждого Задача Из Модель.Задачи Цикл %}
<li>{{ Задача.Название }}</li>
{% КонецЦикла; %}
</ul>Разбор JinjOS строже, чем кажется: внутри {% %} операторы завершаются точкой с запятой ({% КонецЦикла; %}), выражение в {{ }} не может содержать закрывающую фигурную скобку, а блок {% %} - знак процента. Моделью может быть Структура, Соответствие или любой объект с полями.
Методы
| Метод | Возвращает | Назначение |
|---|---|---|
Отрендерить | Строка | Базовый метод: шаблон плюс модель |
Фрагмент | Строка | Часть страницы для htmx |
Страница | Строка | Шаблон, вставленный в макет |
ОтрендеритьТекст | Строка | Шаблон, заданный строкой |
Существует | Булево | Проверка наличия файла шаблона |
ПутьШаблона | Строка | Полный путь к файлу шаблона |
ОчиститьКэш | - | Сброс скомпилированных шаблонов |
Имя шаблона задаётся относительно каталога шаблонов, расширение можно опустить, подкаталоги разрешены. Имена с .., двоеточием и ведущим слешем отвергаются: имя шаблона нередко приходит из запроса, а через него нельзя давать читать произвольный файл на диске.
Отрендерить
Функция Отрендерить(Знач ИмяШаблона, Знач Модель = Неопределено) ЭкспортФормирует шаблон с моделью. Базовый метод: Фрагмент и Страница построены на нём.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
ИмяШаблона | Строка | Имя файла шаблона относительно каталога шаблонов |
Модель | Структура, Соответствие, Произвольный | Данные шаблона, доступные как Модель |
Возвращаемое значение: Строка - готовая разметка.
Разметка = Отображения.Отрендерить("задачи/строка", Новый Структура("Название", "Купить хлеб"));Модель Неопределено заменяется пустой структурой: сообщение об отсутствующем поле понятнее, чем «значение не является значением объектного типа».
Фрагмент
Функция Фрагмент(Знач ИмяШаблона, Знач Модель = Неопределено) ЭкспортФормирует фрагмент разметки - часть страницы, которую htmx подставит в целевой элемент. Отличается от Отрендерить только названием, читаемым в коде обработчика htmx: фрагмент возвращается без макета.
Параметры: те же, что у Отрендерить.
Возвращаемое значение: Строка - разметка фрагмента.
Ответ.ТелоТекст = Отображения.Фрагмент("задачи/строка", Задача);Страница
Функция Страница(Знач ИмяШаблона, Знач Модель = Неопределено, Знач Макет = Неопределено) ЭкспортФормирует полную страницу: шаблон вставляется в макет на место плейсхолдера. Макет получает ту же модель, поэтому в нём доступны, например, заголовок страницы и данные пользователя.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
ИмяШаблона | Строка | Имя файла шаблона с содержимым |
Модель | Структура, Соответствие, Произвольный | Данные шаблона |
Макет | Строка | Имя файла макета. Неопределено - макет по умолчанию |
Возвращаемое значение: Строка - разметка страницы. Без макета совпадает с фрагментом.
Макет без плейсхолдера даёт исключение: страница без содержимого - почти наверняка ошибка в шаблоне.
Ответ.ТелоТекст = Отображения.Страница("задачи/список", Модель);
Ответ.ТелоТекст = Отображения.Страница("задачи/список", Модель, "макет-печати");ОтрендеритьТекст
Функция ОтрендеритьТекст(Знач ТекстШаблона, Знач Модель = Неопределено) ЭкспортФормирует шаблон, заданный текстом, минуя файлы и кэш. Полезно для писем и коротких вставок, которые незачем выносить в отдельный файл.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
ТекстШаблона | Строка | Разметка с подстановками |
Модель | Структура, Соответствие, Произвольный | Данные шаблона |
Возвращаемое значение: Строка - готовая разметка.
Сообщить(Отображения.ОтрендеритьТекст("<b>{{ Модель.Имя }}</b>", Новый Структура("Имя", "Пётр")));Существует
Функция Существует(Знач ИмяШаблона) ЭкспортПараметры: ИмяШаблона - Строка имя файла шаблона.
Возвращаемое значение: Булево - Истина, если шаблон найден.
Если Отображения.Существует("задачи/карточка") Тогда
Ответ.ТелоТекст = Отображения.Фрагмент("задачи/карточка", Задача);
КонецЕсли;ПутьШаблона
Функция ПутьШаблона(Знач ИмяШаблона) ЭкспортВозвращает полный путь к файлу шаблона - тот, по которому шаблон будет прочитан. Расширение по умолчанию дописывается здесь же.
Параметры: ИмяШаблона - Строка имя файла шаблона, расширение можно опустить.
Возвращаемое значение: Строка - полный путь к файлу.
Сообщить(Отображения.ПутьШаблона("задачи/строка")); // C:\app\шаблоны\задачи\строка.htmlОчиститьКэш
Процедура ОчиститьКэш() ЭкспортЗабывает скомпилированные шаблоны. Нужно, если файлы изменились, а кэширование включено.
Отображения.ОчиститьКэш();Сообщения об ошибках
| Ситуация | Сообщение |
|---|---|
| Шаблон не найден | winow-view: шаблон задачи/строка не найден, искали файл C:\app\шаблоны\задачи\строка.html |
| Недопустимое имя | winow-view: недопустимое имя шаблона ../../packagedef |
| Макет без плейсхолдера | winow-view: макет макет не содержит плейсхолдер @Контент |
| Ошибка внутри шаблона | winow-view: ошибка формирования шаблона задачи/строка: ... |
Сообщение об отсутствующем шаблоне называет и имя, и путь: чаще всего расходятся именно они.
Смотри также
Модуль View
Фасад библиотеки. Делает четыре вещи: читает и выставляет заголовки htmx, экранирует значения модели, отдаёт htmx и Alpine.js как статику и создаёт объекты рендеринга и защиты форм.
Все функции принимают и возвращают нейтральные значения - Соответствие заголовков и строки, - поэтому работают и внутри winow, и в тестах без поднятого сервера.
#Использовать winow-viewСправочник заголовков: htmx headers.
Состав
| Группа | Методы |
|---|---|
| Заголовки запроса | ЭтоHxЗапрос, ЭтоHxBoosted, ЦельHx, ТриггерHx, ИмяТриггераHx, ТекущийАдресHx, ЭтоЗапросИсторииHx, ЗапросПодтвержденияHx, ЗначениеЗаголовка |
| Заголовки ответа | УстановитьТриггер, УстановитьТриггерПослеЗамены, УстановитьТриггерПослеУстановки, Перенаправить, Обновить, ЗаменитьАдрес, ПротолкнутьАдрес, ПереопределитьЦель, ПереопределитьСпособЗамены, ПереопределитьВыборку |
| Экранирование | ЭкранироватьHtml, ЭкранироватьАтрибут |
| Статика | ПутьКСтатике, ФайлБиблиотеки, СодержимоеБиблиотеки, ТегиПодключения, ВерсииБиблиотек |
| Объекты | СоздатьОтображения, СоздатьЗащитуCSRF |
Заголовки запроса
Все функции группы принимают один параметр:
| Параметр | Тип | Описание |
|---|---|---|
Заголовки | Соответствие, Структура | Заголовки запроса, в winow это Запрос.Заголовки |
Регистр имён заголовков не важен: HTTP/2 передаёт их только в нижнем регистре, а прокси нормализуют по-своему. Отсутствующий заголовок даёт Ложь для проверок и пустую строку для значений.
| Метод | Возвращает | Заголовок | Смысл |
|---|---|---|---|
ЭтоHxЗапрос(Заголовки) | Булево | HX-Request | Запрос отправлен htmx, а не обычным переходом браузера |
ЭтоHxBoosted(Заголовки) | Булево | HX-Boosted | Запрос вызван ссылкой или формой с hx-boost |
ЭтоЗапросИсторииHx(Заголовки) | Булево | HX-History-Restore-Request | htmx восстанавливает страницу из истории |
ЦельHx(Заголовки) | Строка | HX-Target | Идентификатор элемента, в который подставится ответ |
ТриггерHx(Заголовки) | Строка | HX-Trigger | Идентификатор элемента, вызвавшего запрос |
ИмяТриггераHx(Заголовки) | Строка | HX-Trigger-Name | Атрибут name этого элемента |
ТекущийАдресHx(Заголовки) | Строка | HX-Current-URL | Адрес страницы, с которой отправлен запрос |
ЗапросПодтвержденияHx(Заголовки) | Строка | HX-Prompt | Ответ пользователя на hx-prompt |
Основное применение - решение, чем отвечать. Фрагмент отдаётся только на обычный hx-запрос: hx-boost и восстановление истории заменяют содержимое body, поэтому им нужна страница целиком.
Если View.ЭтоHxЗапрос(Запрос.Заголовки) И Не View.ЭтоHxBoosted(Запрос.Заголовки) Тогда
Ответ.ТелоТекст = Отображения.Фрагмент("задачи/список", Модель);
Иначе
Ответ.ТелоТекст = Отображения.Страница("задачи/список", Модель);
КонецЕсли;
Сообщить(View.ЦельHx(Запрос.Заголовки)); // задачи
Сообщить(View.ИмяТриггераHx(Запрос.Заголовки)); // названиеЗначениеЗаголовка
Функция ЗначениеЗаголовка(Знач Заголовки, Знач Имя, Знач ЗначениеПоУмолчанию = "") ЭкспортВозвращает произвольный заголовок независимо от регистра его имени.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
Заголовки | Соответствие, Структура | Заголовки запроса |
Имя | Строка | Имя заголовка |
ЗначениеПоУмолчанию | Произвольный | Что вернуть, если заголовка нет |
Возвращаемое значение: Строка, Произвольный - значение заголовка.
Язык = View.ЗначениеЗаголовка(Запрос.Заголовки, "Accept-Language", "ru-RU");Заголовки ответа
Все функции группы возвращают то же Соответствие, что получили, поэтому вызовы можно ставить подряд. Если передать Неопределено, Соответствие создаётся.
| Параметр | Тип | Описание |
|---|---|---|
Заголовки | Соответствие | Заголовки ответа, в winow это Ответ.Заголовки. Неопределено создаёт новое |
| Метод | Заголовок | Что делает клиент |
|---|---|---|
Перенаправить(Заголовки, Адрес) | HX-Redirect | Переходит по адресу |
Обновить(Заголовки) | HX-Refresh | Перезагружает страницу целиком |
ЗаменитьАдрес(Заголовки, Адрес) | HX-Replace-Url | Заменяет адрес в строке браузера без записи в историю |
ПротолкнутьАдрес(Заголовки, Адрес) | HX-Push-Url | Добавляет адрес в историю, кнопка «назад» вернёт состояние |
ПереопределитьЦель(Заголовки, Селектор) | HX-Retarget | Подставляет ответ в другой элемент |
ПереопределитьСпособЗамены(Заголовки, Способ) | HX-Reswap | Меняет способ подстановки: значения те же, что у hx-swap |
ПереопределитьВыборку(Заголовки, Селектор) | HX-Reselect | Берёт из ответа только часть, перекрывая hx-select |
Параметр Адрес - Строка с адресом перехода, Селектор - Строка с CSS-селектором, Способ - Строка вида innerHTML, outerHTML, beforeend, none.
// Ошибку валидации показываем в общем блоке сообщений, а не в элементе,
// который просил ответ
View.ПереопределитьСпособЗамены(View.ПереопределитьЦель(Ответ.Заголовки, "#ошибки"), "outerHTML");
// Код 302 для hx-запроса не работает: браузер подставил бы результат
// в целевой элемент
View.Перенаправить(Ответ.Заголовки, "/задачи/список");Триггеры
Функция УстановитьТриггер(Знач Заголовки, Знач Имя, Знач Данные = Неопределено) Экспорт
Функция УстановитьТриггерПослеЗамены(Знач Заголовки, Знач Имя, Знач Данные = Неопределено) Экспорт
Функция УстановитьТриггерПослеУстановки(Знач Заголовки, Знач Имя, Знач Данные = Неопределено) ЭкспортПросят htmx вызвать событие на клиенте. Три метода различаются моментом вызова:
| Метод | Заголовок | Когда событие вызывается |
|---|---|---|
УстановитьТриггер | HX-Trigger | Сразу после получения ответа |
УстановитьТриггерПослеЗамены | HX-Trigger-After-Swap | После подстановки ответа в DOM |
УстановитьТриггерПослеУстановки | HX-Trigger-After-Settle | После анимаций и досылки атрибутов |
Параметры
| Параметр | Тип | Описание |
|---|---|---|
Заголовки | Соответствие | Заголовки ответа |
Имя | Строка | Имя события, например задачаДобавлена. Пустое имя даёт исключение |
Данные | Структура, Соответствие, Строка, Число, Булево | Подробности события, попадают в detail на клиенте |
Возвращаемое значение: Соответствие - заголовки ответа с соответствующим заголовком.
Повторные вызовы накапливаются. Единственное событие без данных передаётся простым именем - так заголовок читается в отладчике браузера. Как только появляются данные или второе событие, заголовок становится объектом JSON.
View.УстановитьТриггер(Ответ.Заголовки, "задачаДобавлена");
// HX-Trigger: задачаДобавлена
View.УстановитьТриггер(Ответ.Заголовки, "счётчикИзменён", Новый Структура("всего", 3));
// HX-Trigger: {"задачаДобавлена":null,"счётчикИзменён":{"всего":3}}Экранирование
Шаблонизатор подставляет значения как есть, поэтому всё, что пришло от пользователя, экранируется явно.
Функция ЭкранироватьHtml(Знач Текст) Экспорт
Функция ЭкранироватьАтрибут(Знач Текст) Экспорт| Метод | Куда безопасно вставлять | Дополнительно к ЭкранироватьHtml |
|---|---|---|
ЭкранироватьHtml | Текстовое содержимое элемента | - |
ЭкранироватьАтрибут | Значение атрибута в кавычках | Снимает обратную кавычку |
Параметры
| Параметр | Тип | Описание |
|---|---|---|
Текст | Произвольный | Выводимое значение. Числа и Неопределено допустимы |
Возвращаемое значение: Строка - значение, безопасное для вставки.
Модель.Вставить("Название", View.ЭкранироватьHtml(Задача.Название));
Модель.Вставить("Подсказка", View.ЭкранироватьАтрибут(Задача.Комментарий));<li title="{{ Модель.Подсказка }}">{{ Модель.Название }}</li>Обратная кавычка в атрибуте без кавычек работает ограничителем значения в некоторых браузерах, поэтому ЭкранироватьАтрибут заменяет и её. Значение атрибута всё равно берите в кавычки.
Статика
ПутьКСтатике
Функция ПутьКСтатике() ЭкспортКаталог с библиотеками, поставляемыми в составе пакета. Его достаточно зарегистрировать в winow как каталог статики.
Возвращаемое значение: Строка - полный путь к каталогу.
Приложение.ДобавитьКаталогСтатики("/static", View.ПутьКСтатике());ФайлБиблиотеки
Функция ФайлБиблиотеки(Знач Имя) ЭкспортПараметры: Имя - Строка "htmx" или "alpine", допускается и полное имя файла.
Возвращаемое значение: Строка - полный путь к файлу.
Сообщить(View.ФайлБиблиотеки("htmx")); // ...\src\static\htmx.min.jsСодержимоеБиблиотеки
Функция СодержимоеБиблиотеки(Знач Имя) ЭкспортВозвращает содержимое поставляемой библиотеки. Нужно, когда файлы отдаёт сам обработчик, а не каталог статики winow.
Параметры: Имя - Строка "htmx" или "alpine", допускается и полное имя файла.
Возвращаемое значение: Строка - текст файла библиотеки.
Имя проверяется по закрытому списку: имя, пришедшее из запроса, не прочитает ничего, кроме двух поставляемых файлов, даже если в нём приедет ../.
&ТочкаМаршрута("static/{ИмяФайла}")
Процедура Библиотека(ИмяФайла, Ответ) Экспорт
Ответ.УстановитьТипКонтента("js");
Ответ.ТелоТекст = View.СодержимоеБиблиотеки(ИмяФайла);
КонецПроцедурыТегиПодключения
Функция ТегиПодключения(Знач Префикс = "/static") ЭкспортТеги подключения htmx и Alpine.js для вставки в макет. Завершающие слеши в префиксе отбрасываются.
Параметры: Префикс - Строка адрес, по которому раздаётся каталог статики.
Возвращаемое значение: Строка - два тега script, разделённые переводом строки.
Модель.Вставить("Скрипты", View.ТегиПодключения("/static"));<script src="/static/htmx.min.js"></script>
<script src="/static/alpine.min.js" defer></script>Alpine.js подключается с defer не для скорости: без него библиотека инициализируется раньше, чем разобран документ, и не находит разметку.
ВерсииБиблиотек
Функция ВерсииБиблиотек() ЭкспортВозвращаемое значение: Соответствие - "htmx" и "alpine" -> версия.
Версия проверяется тестом: объявленная здесь должна совпадать с версией внутри файла, иначе документация и то, что реально уходит браузеру, разъедутся.
Сообщить(View.ВерсииБиблиотек().Получить("htmx")); // 2.0.10Объекты
СоздатьОтображения
Функция СоздатьОтображения(Знач КаталогШаблонов, Знач Параметры = Неопределено) ЭкспортСоздаёт объект рендеринга шаблонов.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
КаталогШаблонов | Строка | Каталог с файлами шаблонов |
Параметры | Структура, Соответствие | Настройки, см. ViewRenderer |
Возвращаемое значение: ViewRenderer - объект рендеринга.
Отображения = View.СоздатьОтображения("шаблоны", Новый Структура("Макет", "макет"));СоздатьЗащитуCSRF
Функция СоздатьЗащитуCSRF(Знач Секрет, Знач СрокЖизни = 3600) ЭкспортСоздаёт защиту форм от CSRF.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
Секрет | Строка | Секрет приложения для подписи токенов |
СрокЖизни | Число | Срок жизни токена в секундах |
Возвращаемое значение: CsrfGuard - объект защиты форм.
Защита = View.СоздатьЗащитуCSRF(ПолучитьПеременнуюСреды("APP_SECRET"));