Форум сайта python.su
Приветствую всех!
Я вот снова поначитался, что шаблонизатор Jinja2 в разы быстрее стандартного шаблонизатора Django, что стоит на него переходить, и я действительно решил попробовать сделать переход на него. Установил Jinja2, в settings изменил настройки по инструкции:
{ 'NAME': 'jinja2', 'BACKEND': 'django.template.backends.jinja2.Jinja2', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'environment': 'ParadoxPortal.jinja2.environment', 'autoescape': False, } },
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
Офлайн
paradox81ru
Для шаблонов у меня используется довольно много функций, которые нужно добавлять в начальные настройки окружения
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,
}
Офлайн
Зачем? Если у вас есть необходимость делать в шаблоне что-то за рамками отображения контекста, значит вы нарушаете 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.
Офлайн
552 файла шаблонов, 140 тыс. строк. Вот весь набор функций, внедренных в окружение шаблонизатораЯ сейчас глянул файлы Jinja2 в приложении, и там их чего-то не больше тридцати, и не одного шаблона нет. Может Вы имеете в виду приложение Django-Jinja2? Потому что у меня установлена именно Jinja2.
Офлайн
paradox81ruЯ вам показываю свои файлы, проекта над которым сам работаю. Это демонстрация того, что не нужны в jinja никакие какстомные функции.
Я сейчас глянул файлы Jinja2 в приложении, и там их чего-то не больше тридцати, и не одного шаблона нет. Может Вы имеете в виду приложение Django-Jinja2? Потому что у меня установлена именно Jinja2.
paradox81ru
Это функции, которые до этого в шаблонизаторе Django были тэгами
paradox81ru
Это различные менюшки, крошки, информативная иконка почты, строка отображения текущего пользователя, и т.д.
<ul class="menu">
{% for menu_item in menu.get_items() %}
<li class="menu-item">
<span>{{ _(menu_item.text) }}</span>
</li>
{% endfor %}
</ul>
<html>
<head></head>
<body>
{% block menu %}
{% with menu=user.get_menu() %}
{% include 'menu.html' %}
{% endwith %}
{% endblock %}
</body>
</html>
Отредактировано FishHook (Апрель 8, 2019 07:58:59)
Офлайн
Это все решается по-другому: инклюдом шаблонов, макросами, CSS-стилями, ООПНу а если логика формирования меню несколько более сложная, чем перебор пунктов меню? У меня, допустим, меню двухуровневое, и набор меню зависит от разрешений пользователя, который авторизовался И иконки могут изменяться в пунктах меню в зависимости от обстоятельств.
Офлайн
paradox81ruДа хоть пятиуровневое, какая разница? В шаблон вы должны передать структуру необходимую и достаточную для построения разметки. Бэкенд вообще ничего не должен знать о том, как ваше меню выглядит, какие там иконки, анимации и прочее. Вы должны иметь возможность полностью заменить фронтенд не меняя ни байта бэкенда. Завтра вы решите, что рендеринг HTML - устаревший подход и захотите SPA сделанный, наример, на React. Если раньше вы передавали в шаблон словарь, который легко можно серилизовать в JSON, то изменения в вашем бэкенде будут тривиальны. А куда девать все эти ваши кастомные теги, фильтры и прочую лабуду? Да никуда, это мертвый код. Для того, чтобы написать алгоритм люьой сложности, достаточно иметь две управляющие конструкции: ветвления и переходы. В Jinja есть мощные средства, такие как макросы, которые могут быть рекурсивными (по сути это функции!), циклы, ветвления, блоки, наследование, переменные - это гораздо больше, чем ветвления и переходы, у вас есть все, чтобы рендерить сколь угодно забубенную разметку. Другое дело, что новый проект таким образом строить вовсе не стоит, сейчас актуален другой подход, а имеено рендеринг на клиенте, вам по сути вообще не нужен никакой шаблонизатор. Вообще. Angular, React, Vue и пр. - это то, что актуально.
Ну а если логика формирования меню несколько более сложная, чем перебор пунктов меню? У меня, допустим, меню двухуровневое, и набор меню зависит от разрешений пользователя, который авторизовался И иконки могут изменяться в пунктах меню в зависимости от обстоятельств.
paradox81ruДык стандартная, на каждое джанго-приложения свой каталог template, в нем шаблоны группируются по подкаталогам в соответствии с пренадлежностью к некоторой предметной области.
Единственно что, может Вы тогда подскажите, какая у Вас структура каталогов
Офлайн
Спасибо Вам большое. Согласен, я делал не правильно, буду переделывать.
Но насчет рендеринга на клиенте, если я правильно понимаю что это, то это спорный подход. Рендеринг на клиенте, это наверное значит также передавать на клиент только какую-то структуру, а сам интерфейс, да и вообще собственно вся HTML разметка, должна строиться за счет javascript, т.е. исключительно силами браузера. Но это даст бОльшую нагрузку на клиентскую машину, а с учетом того что очень многие работают на компьютерах далеко не самых мощных, и сами браузеры сейчас одни из самых ресурсопрожорливых приложений на компьютерах, то это может вызвать дискомфорт при работе с сайтом. Я уже не говорю об адптивных сайтах для открытия их на планшетах и смартфонах. Я уж все таки предпочел бы формировать интерфейс на сервере из шаблонов и передавать его на клиента. Просто подход правильный доложен быть.
Спасибо Вам.
Офлайн
paradox81ru
Рендеринг на клиенте, это наверное значит также передавать на клиент только какую-то структуру, а сам интерфейс, да и вообще собственно вся HTML разметка, должна строиться за счет javascript, т.е. исключительно силами браузера. Но это даст бОльшую нагрузку на клиентскую машину, а с учетом того что очень многие работают на компьютерах далеко не самых мощных, и сами браузеры сейчас одни из самых ресурсопрожорливых приложений на компьютерах, то это может вызвать дискомфорт при работе с сайтом.
paradox81ru
Я уже не говорю об адптивных сайтах для открытия их на планшетах и смартфонах.
Офлайн
от вы откуда это взяли? У вас есть какие-то тесты, бенчмарки, замеры? Ведь нету, вы просто так себе надумали.Может быть и надумал. Это конечно чисто индивидуально-эмпирический метод определения. Просто в нашей организации используются различные информационные системы, я имею ввиду которые на WEB-е, и вот некоторые из них довольно сильно систему загружают, это видно и по ощущениям, и по диспетчеру задач, сколько сразу памяти уходит, и на сколько процессор загружен. И судя по красивому интерфейсу, который уже даже мало чем отличается от десктопного и по виду и по функционалу, очень круто конечно выглядит, очень похоже что генерируется весь это интерфейс именно браузером каким-то javascript-ным фреймворком. И компьютеры Core 2 Due, которых в нашей организации еще предостаточно, ощутимо тормозят при работе с этими система по отношению с другими сайтами. Может конечно это сайты сделаны корявы… Но работать с этими сайтами на слабых машинах очень не комфортно. Собственно из этого я и сделал выводы. Но не буду спорить, сам лично я не проверял, тесты не запускал, может я не прав. Будет возможность, обязательно по тестирую лично.
Офлайн