Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Jinja2. Как обновить набор функций в globals для разных представлений [RSS Feed]

#1 Апрель 7, 2019 19:01:15

paradox81ru
Зарегистрирован: 2017-03-26
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

Приветствую всех!
Я вот снова поначитался, что шаблонизатор Jinja2 в разы быстрее стандартного шаблонизатора Django, что стоит на него переходить, и я действительно решил попробовать сделать переход на него. Установил Jinja2, в settings изменил настройки по инструкции:

    {
        'NAME': 'jinja2',
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'ParadoxPortal.jinja2.environment',
            'autoescape': False,
        }
    },
разумеется создал начальное окружение для Jinja:


 from django.templatetags.static import static
from django.urls import reverse
from jinja2 import Environment
def environment(**options):
    env = Environment(**options)
    env.globals.update({
        'static': static,
        'url': reverse,
        .................,
        .................,
    })
    return env
,
которое и указал в настройках settings.
И все в общем то неплохо, все работает, шаблоны переделываю.
Но возник такой вопрос… Для шаблонов у меня используется довольно много функций, которые нужно добавлять в начальные настройки окружения, в globals, при этом многие функция используются все-то лишь в одном представлении. Возможно ли добавлять некоторые функции в globals непосредственно в самом представлении, перед его отображением, чтобы не загружать сразу Jinja целой кучей функций? Ведь этот environment шаблонизатора Jinja2 должен где-то храниться, ну так можно ли до него добраться как-нибудь уже после загрузки настроек Django и внести в него изменения?

Офлайн

#2 Апрель 8, 2019 06:37:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

paradox81ru
Для шаблонов у меня используется довольно много функций, которые нужно добавлять в начальные настройки окружения

Зачем? Если у вас есть необходимость делать в шаблоне что-то за рамками отображения контекста, значит вы нарушаете MVC. Приведите пример такой функции.

Чтобы не быть голословным:


552 файла шаблонов, 140 тыс. строк. Вот весь набор функций, внедренных в окружение шаблонизатора

env.globals = {
'url': url,
'range': six.moves.range,
'static': static,
"_": ugettezt_lazy,
"enumerate": enumerate,
"now": timezone.now,
"format": format,
"sorted": sorted,
"min": min,
"max": max,
}



Офлайн

#3 Апрель 8, 2019 07:09:43

paradox81ru
Зарегистрирован: 2017-03-26
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

Зачем? Если у вас есть необходимость делать в шаблоне что-то за рамками отображения контекста, значит вы нарушаете MVC. Приведите пример такой функции.
Все эти функции служат для отображения какой то части интерфейса. Это функции, которые до этого в шаблонизаторе Django были тэгами, но так как в jinja прекрасно работают функции, и надобности лишний раз создавать тэги нет, то я подключаю эти функции. Это различные менюшки, крошки, информативная иконка почты, строка отображения текущего пользователя, и т.д. Конечно, все это можно добавлять в контекст шаблона уже в виде сформированной html-строки, но вот тогда уже наверное действительно будет нарушаться смысл MVC, когда я работу по формированию интерфеса из шаблона буду переводить в сам View. Хотя, если честно, в шаблонизаторе Django я именно так зачастую и делал, чтобы не загружать и так, как я понимаю, не самый быстрый шаблонизатор. И я потому и решил перейти на Jinja, чтобы более широко использовать его возможности.

552 файла шаблонов, 140 тыс. строк. Вот весь набор функций, внедренных в окружение шаблонизатора
В руководстве по Jinja2 указан весьма скудный набор тэгов и функций. http://jinja.pocoo.org/docs/2.10/templates/#list-of-global-functions Да, там вроде бы неплохой набор фильтров, но и он не сравниться с фильтрами Django, поэтому добавить вполне что есть, например даже тот же самый фильтр для форматирования даты, аналог фильтра date в Django.

Офлайн

#4 Апрель 8, 2019 07:16:39

paradox81ru
Зарегистрирован: 2017-03-26
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

552 файла шаблонов, 140 тыс. строк. Вот весь набор функций, внедренных в окружение шаблонизатора
Я сейчас глянул файлы Jinja2 в приложении, и там их чего-то не больше тридцати, и не одного шаблона нет. Может Вы имеете в виду приложение Django-Jinja2? Потому что у меня установлена именно Jinja2.

Офлайн

#5 Апрель 8, 2019 07:57:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

paradox81ru
Я сейчас глянул файлы Jinja2 в приложении, и там их чего-то не больше тридцати, и не одного шаблона нет. Может Вы имеете в виду приложение Django-Jinja2? Потому что у меня установлена именно Jinja2.
Я вам показываю свои файлы, проекта над которым сам работаю. Это демонстрация того, что не нужны в jinja никакие какстомные функции.

paradox81ru
Это функции, которые до этого в шаблонизаторе Django были тэгами

Эти тэги - это от тупости и бедности джанги. Они не нужны в нормальном шаблонизаторе.

paradox81ru
Это различные менюшки, крошки, информативная иконка почты, строка отображения текущего пользователя, и т.д.

Это все решается по-другому: инклюдом шаблонов, макросами, CSS-стилями, ООП

menu.html
<ul class="menu">
{% for menu_item in menu.get_items() %}
<li class="menu-item">
<span>{{ _(menu_item.text) }}</span>
</li>
{% endfor %}
</ul>

base.html
<html>
<head></head>
<body>
{% block menu %}
{% with menu=user.get_menu() %}
{% include 'menu.html' %}
{% endwith %}
{% endblock %}
</body>
</html>

Зачем нужен тег для “{% menu %}”???



Отредактировано FishHook (Апрель 8, 2019 07:58:59)

Офлайн

#6 Апрель 8, 2019 09:37:30

paradox81ru
Зарегистрирован: 2017-03-26
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

Это все решается по-другому: инклюдом шаблонов, макросами, CSS-стилями, ООП
Ну а если логика формирования меню несколько более сложная, чем перебор пунктов меню? У меня, допустим, меню двухуровневое, и набор меню зависит от разрешений пользователя, который авторизовался И иконки могут изменяться в пунктах меню в зависимости от обстоятельств.
Вообще, Вы возможно и правы. Я так понял, Вы имеете в виду, что надо строить логику так, чтобы в шаблонах использовать преимущественно только встроенные тэги? Т.е. большинство логики в шаблонах должно реализовываться посредством тэгов If, For и Include? Мне просто кажется, что все таки более наглядно формировать тэг в функции, причем в функции то я его формирую часто также используя шаблонизатор Jinja, а потом уже, допустии в базовом шаблоне, в нужном месте, просто указываю тэг, или функцию, которая сформирует меню. По наглядности и удобству так по крайней мере получается неплохо. Но если честно, как должно быть правильно, не знаю. Наверное Include в принципе должна дать примерно такую же функциональность как и глобальные функции. Я конечно попробую пересмотреть логику формирования представлению по Вашему примеру. Единственно что, может Вы тогда подскажите, какая у Вас структура каталогов, где располагаются шаблоны, что бы не запутаться в таком количестве шаблонов? Там ведь получается есть базовые шаблоны, есть шаблоны включаемые в базовые в виде модуля, есть шаблоны уникальные для приложения, наверное есть какие-то шаблоны, которые используются повсеместно…

Офлайн

#7 Апрель 8, 2019 10:12:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

paradox81ru
Ну а если логика формирования меню несколько более сложная, чем перебор пунктов меню? У меня, допустим, меню двухуровневое, и набор меню зависит от разрешений пользователя, который авторизовался И иконки могут изменяться в пунктах меню в зависимости от обстоятельств.
Да хоть пятиуровневое, какая разница? В шаблон вы должны передать структуру необходимую и достаточную для построения разметки. Бэкенд вообще ничего не должен знать о том, как ваше меню выглядит, какие там иконки, анимации и прочее. Вы должны иметь возможность полностью заменить фронтенд не меняя ни байта бэкенда. Завтра вы решите, что рендеринг HTML - устаревший подход и захотите SPA сделанный, наример, на React. Если раньше вы передавали в шаблон словарь, который легко можно серилизовать в JSON, то изменения в вашем бэкенде будут тривиальны. А куда девать все эти ваши кастомные теги, фильтры и прочую лабуду? Да никуда, это мертвый код. Для того, чтобы написать алгоритм люьой сложности, достаточно иметь две управляющие конструкции: ветвления и переходы. В Jinja есть мощные средства, такие как макросы, которые могут быть рекурсивными (по сути это функции!), циклы, ветвления, блоки, наследование, переменные - это гораздо больше, чем ветвления и переходы, у вас есть все, чтобы рендерить сколь угодно забубенную разметку. Другое дело, что новый проект таким образом строить вовсе не стоит, сейчас актуален другой подход, а имеено рендеринг на клиенте, вам по сути вообще не нужен никакой шаблонизатор. Вообще. Angular, React, Vue и пр. - это то, что актуально.

paradox81ru
Единственно что, может Вы тогда подскажите, какая у Вас структура каталогов
Дык стандартная, на каждое джанго-приложения свой каталог template, в нем шаблоны группируются по подкаталогам в соответствии с пренадлежностью к некоторой предметной области.



Офлайн

#8 Апрель 8, 2019 10:46:56

paradox81ru
Зарегистрирован: 2017-03-26
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

Спасибо Вам большое. Согласен, я делал не правильно, буду переделывать.
Но насчет рендеринга на клиенте, если я правильно понимаю что это, то это спорный подход. Рендеринг на клиенте, это наверное значит также передавать на клиент только какую-то структуру, а сам интерфейс, да и вообще собственно вся HTML разметка, должна строиться за счет javascript, т.е. исключительно силами браузера. Но это даст бОльшую нагрузку на клиентскую машину, а с учетом того что очень многие работают на компьютерах далеко не самых мощных, и сами браузеры сейчас одни из самых ресурсопрожорливых приложений на компьютерах, то это может вызвать дискомфорт при работе с сайтом. Я уже не говорю об адптивных сайтах для открытия их на планшетах и смартфонах. Я уж все таки предпочел бы формировать интерфейс на сервере из шаблонов и передавать его на клиента. Просто подход правильный доложен быть.
Спасибо Вам.

Офлайн

#9 Апрель 8, 2019 11:14:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

paradox81ru
Рендеринг на клиенте, это наверное значит также передавать на клиент только какую-то структуру, а сам интерфейс, да и вообще собственно вся HTML разметка, должна строиться за счет javascript, т.е. исключительно силами браузера. Но это даст бОльшую нагрузку на клиентскую машину, а с учетом того что очень многие работают на компьютерах далеко не самых мощных, и сами браузеры сейчас одни из самых ресурсопрожорливых приложений на компьютерах, то это может вызвать дискомфорт при работе с сайтом.

Вот вы откуда это взяли? У вас есть какие-то тесты, бенчмарки, замеры? Ведь нету, вы просто так себе надумали. А что если вы думаете неправильно? Это же ведь не инженерный подход, а гадание на кофейной гуще. Люди заморачиваются замерами, собирают статистику вы можете найти в интеренете кучу всевозможных цифр, на основании которых надо делать выводы.

paradox81ru
Я уже не говорю об адптивных сайтах для открытия их на планшетах и смартфонах.

Очень зря, что не говорите. Адаптивность сайта, это как раз задача клиента. Никак не сервера.



Офлайн

#10 Апрель 8, 2019 19:02:39

paradox81ru
Зарегистрирован: 2017-03-26
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Jinja2. Как обновить набор функций в globals для разных представлений

от вы откуда это взяли? У вас есть какие-то тесты, бенчмарки, замеры? Ведь нету, вы просто так себе надумали.
Может быть и надумал. Это конечно чисто индивидуально-эмпирический метод определения. Просто в нашей организации используются различные информационные системы, я имею ввиду которые на WEB-е, и вот некоторые из них довольно сильно систему загружают, это видно и по ощущениям, и по диспетчеру задач, сколько сразу памяти уходит, и на сколько процессор загружен. И судя по красивому интерфейсу, который уже даже мало чем отличается от десктопного и по виду и по функционалу, очень круто конечно выглядит, очень похоже что генерируется весь это интерфейс именно браузером каким-то javascript-ным фреймворком. И компьютеры Core 2 Due, которых в нашей организации еще предостаточно, ощутимо тормозят при работе с этими система по отношению с другими сайтами. Может конечно это сайты сделаны корявы… Но работать с этими сайтами на слабых машинах очень не комфортно. Собственно из этого я и сделал выводы. Но не буду спорить, сам лично я не проверял, тесты не запускал, может я не прав. Будет возможность, обязательно по тестирую лично.

Офлайн

  • Начало
  • » Django
  • » Jinja2. Как обновить набор функций в globals для разных представлений[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version