py.lib.aw_web_tools

Yohn Y. 2025-10-19 Parent:376688747096

17:6b4e0649e388 Go to Latest

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

. Не изменена версия в редыдущем коммите

History
awgur@11 1 # coding: utf-8
awgur@11 2 """\
awgur@11 3 Инструментарий, призванный помочь в кодировании генерации страниц, посредством
awgur@11 4 ``Bottle.SimpleTemplate``
awgur@11 5 """
awgur@11 6
awgur@13 7 from bottle import SimpleTemplate, TemplateError, static_file
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@13 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@12 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@12 40
awgur@11 41 return self.tmpl.render(**kw_params)
awgur@11 42
awgur@13 43 @classmethod
awgur@13 44 def init_devel_factory(cls, file_name: str, **static_params):
awgur@13 45 """\
awgur@13 46 Вместо объекта создаётся фабрика объектов, при кажом вызове которой инициализируется новый объект.
awgur@13 47
awgur@13 48 Помогает в работе над шаблонами
awgur@13 49 :param file_name: Имя файла шаблона, по которому его сможет отыскать класс ``SimpleTemplate``
awgur@13 50 :param static_params: Параметры, добавляемые в шаблон страницы при каждой генерации
awgur@13 51 """
awgur@13 52
awgur@13 53 def func(*a, **kwa):
awgur@13 54 obj = cls(file_name=file_name, **static_params)
awgur@13 55
awgur@13 56 return obj(*a, **kwa)
awgur@13 57
awgur@13 58 return func
awgur@13 59
awgur@11 60 @staticmethod
awgur@11 61 def set_root(*a):
awgur@11 62 """\
awgur@11 63 Устанавливаем новый корневой каталог, относительного которого будет происходить поиск имён шаблонов
awgur@11 64 при их инициализации.
awgur@11 65
awgur@11 66 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
awgur@11 67 """
awgur@11 68 global TMPL_ROOT
awgur@11 69
awgur@11 70 new_root = p_join(*a)
awgur@11 71 if not isdir(new_root):
awgur@11 72 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
awgur@11 73
awgur@11 74 with _SPINLOCK:
awgur@11 75 TMPL_ROOT = (new_root,)
awgur@11 76
awgur@11 77 @staticmethod
awgur@11 78 def add_root(*a):
awgur@11 79 """\
awgur@11 80 Аналогичнен методу ``set_root()``, за тем исключением, что путь добавляется к имеющемуся корню,
awgur@11 81 а не заменяет его.
awgur@11 82
awgur@11 83 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
awgur@11 84 """
awgur@11 85 global TMPL_ROOT
awgur@11 86
awgur@11 87 new_root = p_join(*a)
awgur@11 88 if not isdir(new_root):
awgur@11 89 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
awgur@11 90
awgur@11 91 with _SPINLOCK:
awgur@11 92 TMPL_ROOT += (new_root,)