py.lib.aw_web_tools
2025-03-02
Child:1e2c40d95710
py.lib.aw_web_tools/src/aw_web_tools/simple_template_helper.py
.. 1.202503.3 + Модуль-обёртка над `SimpleTemplate`
| awgur@11 | 1 # coding: utf-8 |
| awgur@11 | 2 """\ |
| awgur@11 | 3 Инструментарий, призванный помочь в кодировании генерации страниц, посредством |
| awgur@11 | 4 ``Bottle.SimpleTemplate`` |
| awgur@11 | 5 """ |
| awgur@11 | 6 |
| awgur@11 | 7 from bottle import SimpleTemplate, TemplateError |
| awgur@11 | 8 from os.path import join as p_join, isdir |
| awgur@11 | 9 from os import getcwd |
| awgur@11 | 10 from threading import RLock |
| awgur@11 | 11 |
| awgur@11 | 12 _SPINLOCK = RLock() |
| awgur@11 | 13 TMPL_ROOT = (getcwd(),) |
| awgur@11 | 14 |
| awgur@11 | 15 |
| awgur@11 | 16 class SimpleTmplWrapper(object): |
| awgur@11 | 17 def __init__(self, file_name: str, **static_params): |
| awgur@11 | 18 """ |
| awgur@11 | 19 :param file_name: Имя файла шаблона, по которому его сможет отыскать класс ``SimpleTemplate`` |
| awgur@11 | 20 :param static_params: Параметры, добавляемые в шаблон страницы при каждой генерации |
| awgur@11 | 21 """ |
| awgur@11 | 22 try: |
| awgur@11 | 23 self.tmpl = SimpleTemplate(name=file_name, lookup=TMPL_ROOT) |
| awgur@11 | 24 |
| awgur@11 | 25 except TemplateError as e: |
| awgur@11 | 26 raise ValueError(f'Ошибка в инициализации шаблона: {e}') |
| awgur@11 | 27 |
| awgur@11 | 28 self.static_params = static_params |
| awgur@11 | 29 |
| awgur@11 | 30 def __call__(self, **params): |
| awgur@11 | 31 """\ |
| awgur@11 | 32 Сгенерировать страницу по шаблону, обёткой которого является этот класс |
| awgur@11 | 33 |
| awgur@11 | 34 :param params: Параметры шаблона, которые обновляют заданные при инициализации класса параметры и передаются |
| awgur@11 | 35 в метод ``SimpleTemplate.render()`` через параметры ключ-значение. |
| awgur@11 | 36 :return: Результат ``SimpleTemplate.render()`` - сгенерированную страницу |
| awgur@11 | 37 """ |
| awgur@11 | 38 kw_params = self.static_params.copy() |
| awgur@11 | 39 kw_params.update(params) |
| awgur@11 | 40 return self.tmpl.render(**kw_params) |
| awgur@11 | 41 |
| awgur@11 | 42 @staticmethod |
| awgur@11 | 43 def set_root(*a): |
| awgur@11 | 44 """\ |
| awgur@11 | 45 Устанавливаем новый корневой каталог, относительного которого будет происходить поиск имён шаблонов |
| awgur@11 | 46 при их инициализации. |
| awgur@11 | 47 |
| awgur@11 | 48 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории. |
| awgur@11 | 49 """ |
| awgur@11 | 50 global TMPL_ROOT |
| awgur@11 | 51 |
| awgur@11 | 52 new_root = p_join(*a) |
| awgur@11 | 53 if not isdir(new_root): |
| awgur@11 | 54 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}') |
| awgur@11 | 55 |
| awgur@11 | 56 with _SPINLOCK: |
| awgur@11 | 57 TMPL_ROOT = (new_root,) |
| awgur@11 | 58 |
| awgur@11 | 59 @staticmethod |
| awgur@11 | 60 def add_root(*a): |
| awgur@11 | 61 """\ |
| awgur@11 | 62 Аналогичнен методу ``set_root()``, за тем исключением, что путь добавляется к имеющемуся корню, |
| awgur@11 | 63 а не заменяет его. |
| awgur@11 | 64 |
| awgur@11 | 65 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории. |
| awgur@11 | 66 """ |
| awgur@11 | 67 global TMPL_ROOT |
| awgur@11 | 68 |
| awgur@11 | 69 new_root = p_join(*a) |
| awgur@11 | 70 if not isdir(new_root): |
| awgur@11 | 71 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}') |
| awgur@11 | 72 |
| awgur@11 | 73 with _SPINLOCK: |
| awgur@11 | 74 TMPL_ROOT += (new_root,) |