py.lib.aw_web_tools
2025-03-09
Parent:1e2c40d95710
py.lib.aw_web_tools/src/aw_web_tools/simple_template_helper.py
.. 1.202503.5 - Убран devel_mode в конструкторе класса `SimpleTmplWrapper`, поскольку он бесполезен для поставленной задачи + Добавлена фабрака объектов. Этим методом имеется возможность перечитывать страницы шаблона при каждом вызове его. Это помогает в отладке шаблонов.
| 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,) |