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
1 # coding: utf-8
2 """\
3 Инструментарий, призванный помочь в кодировании генерации страниц, посредством
4 ``Bottle.SimpleTemplate``
5 """
7 from bottle import SimpleTemplate, TemplateError, static_file
8 from os.path import join as p_join, isdir
9 from os import getcwd
10 from threading import RLock
12 _SPINLOCK = RLock()
13 TMPL_ROOT = (getcwd(),)
16 class SimpleTmplWrapper(object):
17 def __init__(self, file_name: str, **static_params):
18 """
19 :param file_name: Имя файла шаблона, по которому его сможет отыскать класс ``SimpleTemplate``
20 :param static_params: Параметры, добавляемые в шаблон страницы при каждой генерации
21 """
22 try:
23 self.tmpl = SimpleTemplate(name=file_name, lookup=TMPL_ROOT)
25 except TemplateError as e:
26 raise ValueError(f'Ошибка в инициализации шаблона: {e}')
28 self.static_params = static_params
30 def __call__(self, **params):
31 """\
32 Сгенерировать страницу по шаблону, обёрткой которого является этот класс
34 :param params: Параметры шаблона, которые обновляют заданные при инициализации класса параметры и передаются
35 в метод ``SimpleTemplate.render()`` через параметры ключ-значение.
36 :return: Результат ``SimpleTemplate.render()`` - сгенерированную страницу
37 """
38 kw_params = self.static_params.copy()
39 kw_params.update(params)
41 return self.tmpl.render(**kw_params)
43 @classmethod
44 def init_devel_factory(cls, file_name: str, **static_params):
45 """\
46 Вместо объекта создаётся фабрика объектов, при кажом вызове которой инициализируется новый объект.
48 Помогает в работе над шаблонами
49 :param file_name: Имя файла шаблона, по которому его сможет отыскать класс ``SimpleTemplate``
50 :param static_params: Параметры, добавляемые в шаблон страницы при каждой генерации
51 """
53 def func(*a, **kwa):
54 obj = cls(file_name=file_name, **static_params)
56 return obj(*a, **kwa)
58 return func
60 @staticmethod
61 def set_root(*a):
62 """\
63 Устанавливаем новый корневой каталог, относительного которого будет происходить поиск имён шаблонов
64 при их инициализации.
66 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
67 """
68 global TMPL_ROOT
70 new_root = p_join(*a)
71 if not isdir(new_root):
72 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
74 with _SPINLOCK:
75 TMPL_ROOT = (new_root,)
77 @staticmethod
78 def add_root(*a):
79 """\
80 Аналогичнен методу ``set_root()``, за тем исключением, что путь добавляется к имеющемуся корню,
81 а не заменяет его.
83 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
84 """
85 global TMPL_ROOT
87 new_root = p_join(*a)
88 if not isdir(new_root):
89 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
91 with _SPINLOCK:
92 TMPL_ROOT += (new_root,)