py.lib.aw_web_tools
py.lib.aw_web_tools/src/aw_web_tools/simple_template_helper.py
.. 1.202503.4 + Режим разработки для шаблонов
| 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,) |