py.lib.aw_web_tools

Yohn Y. 2025-03-09 Parent:f444d9fab8f8 Child:376688747096

12:1e2c40d95710 Go to Latest

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

.. 1.202503.4 + Режим разработки для шаблонов

History
1 # coding: utf-8
2 """\
3 Инструментарий, призванный помочь в кодировании генерации страниц, посредством
4 ``Bottle.SimpleTemplate``
5 """
7 from bottle import SimpleTemplate, TemplateError
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, devel_mode: bool = False, **static_params):
18 """
19 :param file_name: Имя файла шаблона, по которому его сможет отыскать класс ``SimpleTemplate``
20 :param devel_mode: Режим разработки. Полезен когда шаблон постоянно изменяется в процессе работы над ним
21 и при каждом ответе его следует перечитывать
22 :param static_params: Параметры, добавляемые в шаблон страницы при каждой генерации
23 """
24 try:
25 self.tmpl = SimpleTemplate(name=file_name, lookup=TMPL_ROOT)
27 except TemplateError as e:
28 raise ValueError(f'Ошибка в инициализации шаблона: {e}')
30 self.static_params = static_params
31 self.devel_mode = devel_mode
33 def __call__(self, **params):
34 """\
35 Сгенерировать страницу по шаблону, обёрткой которого является этот класс
37 :param params: Параметры шаблона, которые обновляют заданные при инициализации класса параметры и передаются
38 в метод ``SimpleTemplate.render()`` через параметры ключ-значение.
39 :return: Результат ``SimpleTemplate.render()`` - сгенерированную страницу
40 """
41 kw_params = self.static_params.copy()
42 kw_params.update(params)
43 if self.devel_mode:
44 self.tmpl.prepare()
46 return self.tmpl.render(**kw_params)
48 @staticmethod
49 def set_root(*a):
50 """\
51 Устанавливаем новый корневой каталог, относительного которого будет происходить поиск имён шаблонов
52 при их инициализации.
54 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
55 """
56 global TMPL_ROOT
58 new_root = p_join(*a)
59 if not isdir(new_root):
60 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
62 with _SPINLOCK:
63 TMPL_ROOT = (new_root,)
65 @staticmethod
66 def add_root(*a):
67 """\
68 Аналогичнен методу ``set_root()``, за тем исключением, что путь добавляется к имеющемуся корню,
69 а не заменяет его.
71 :param *a: Компоненты пути (имена каталогов, его сотавляющих) или имя директории.
72 """
73 global TMPL_ROOT
75 new_root = p_join(*a)
76 if not isdir(new_root):
77 raise ValueError(f'Директория, устанавлиеемая как новый корневой каталог, не существует: {new_root}')
79 with _SPINLOCK:
80 TMPL_ROOT += (new_root,)