py.lib.aw_web_tools

Yohn Y. 2025-03-02 Child:1e2c40d95710

11:f444d9fab8f8 Go to Latest

py.lib.aw_web_tools/src/aw_web_tools/simple_template_helper.py

.. 1.202503.3 + Модуль-обёртка над `SimpleTemplate`

History
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/aw_web_tools/simple_template_helper.py	Sun Mar 02 15:58:06 2025 +0300
     1.3 @@ -0,0 +1,74 @@
     1.4 +# coding: utf-8
     1.5 +"""\
     1.6 +Инструментарий, призванный помочь в кодировании генерации страниц, посредством
     1.7 +``Bottle.SimpleTemplate``
     1.8 +"""
     1.9 +
    1.10 +from bottle import SimpleTemplate, TemplateError
    1.11 +from os.path import join as p_join, isdir
    1.12 +from os import getcwd
    1.13 +from threading import RLock
    1.14 +
    1.15 +_SPINLOCK = RLock()
    1.16 +TMPL_ROOT = (getcwd(),)
    1.17 +
    1.18 +
    1.19 +class SimpleTmplWrapper(object):
    1.20 +    def __init__(self, file_name: str, **static_params):
    1.21 +        """
    1.22 +        :param file_name: Имя файла шаблона, по которому его сможет отыскать класс ``SimpleTemplate``
    1.23 +        :param static_params: Параметры, добавляемые в шаблон страницы при каждой генерации
    1.24 +        """
    1.25 +        try:
    1.26 +            self.tmpl = SimpleTemplate(name=file_name, lookup=TMPL_ROOT)
    1.27 +
    1.28 +        except TemplateError as e:
    1.29 +            raise ValueError(f'Ошибка в инициализации шаблона: {e}')
    1.30 +
    1.31 +        self.static_params = static_params
    1.32 +
    1.33 +    def __call__(self, **params):
    1.34 +        """\
    1.35 +        Сгенерировать страницу по шаблону, обёткой которого является этот класс
    1.36 +
    1.37 +        :param params: Параметры шаблона, которые обновляют заданные при инициализации класса параметры и передаются
    1.38 +                    в метод ``SimpleTemplate.render()`` через параметры ключ-значение.
    1.39 +        :return: Результат ``SimpleTemplate.render()`` - сгенерированную страницу
    1.40 +        """
    1.41 +        kw_params = self.static_params.copy()
    1.42 +        kw_params.update(params)
    1.43 +        return self.tmpl.render(**kw_params)
    1.44 +
    1.45 +    @staticmethod
    1.46 +    def set_root(*a):
    1.47 +        """\
    1.48 +        Устанавливаем новый корневой каталог, относительного которого будет происходить поиск имён шаблонов
    1.49 +        при их инициализации.
    1.50 +
    1.51 +        :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
    1.52 +        """
    1.53 +        global TMPL_ROOT
    1.54 +
    1.55 +        new_root = p_join(*a)
    1.56 +        if not isdir(new_root):
    1.57 +            raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
    1.58 +
    1.59 +        with _SPINLOCK:
    1.60 +            TMPL_ROOT = (new_root,)
    1.61 +
    1.62 +    @staticmethod
    1.63 +    def add_root(*a):
    1.64 +        """\
    1.65 +        Аналогичнен методу ``set_root()``, за тем исключением, что путь добавляется к имеющемуся корню,
    1.66 +        а не заменяет его.
    1.67 +
    1.68 +        :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
    1.69 +        """
    1.70 +        global TMPL_ROOT
    1.71 +
    1.72 +        new_root = p_join(*a)
    1.73 +        if not isdir(new_root):
    1.74 +            raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
    1.75 +
    1.76 +        with _SPINLOCK:
    1.77 +            TMPL_ROOT += (new_root,)