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`
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,)