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