Форум сайта python.su
Добрый день, коллеги!
В процессе проектирования одного приложения (таск-трекер для внутреннего использования) столкнулся со следующей ситуацией..
Есть страница, на которой должен отображаться, к примеру, список задач, исходя из опреденных критериев.
У страницы есть определенная верстка, идентичная другим страницам и, собственно, контент. Это реализуется в шаблоне этой страницы. Но при этом, контент может быть совершенно разным, т.е. не получится просто в цикле вывести однотипные блоки, запросив данные. Например:
К задаче может быть прикреплено обсуждение, иллюстрация или что-то еще.
К задаче может быть прикреплен элемент, требующий повторного запроса к БД (например, график или диаграмма).
Задача может содержать в себе подзадачи, а может быть атомарной.
Т.е. речь о том, что шаблон не может знать, какие именно данные будут в очередном блоке.
Очевидное решение - написать шаблоны для каждого вида блоков, рендерить их по отдельности и возвращать html для их подстановки в общий шаблон. Возможно, что в некоторых ситуациях придется собирать блоки из блоков, которые, в свою очередь будут собираться из блоков и т.д. Трудно предсказать, как оно будет в реальной работе. Само собой, шаблон отдельного блока должен ограничивать эту вложенность, но она может присутствовать.
Потому как у меня нет опыта проектирования таких приложений, я не уверен, что подобное решение является правильным, т.к. породит огромное количество запросов к шаблонизатору, который, в свою очередь, будет читать с диска файлы с шаблонами и т.д. И вообще, довольно монструозно получается. Но альтернатива в виде логики в шаблонах гораздо хуже.
Вот и хотелось бы поинтересоваться у более опытных коллег - может быть есть какие-то другие решения данной проблемы, о которых я просто не знаю? И, может быть, вы порекомендуете шаблонизатор, который позволяет наиболее лаконично реализовать такой функционал?
Платформа для разработки пока не выбрана, но слой работы с данными уже реализован на MongoDB моим коллегой и неплохо работает. Поэтому выбор платформы ограничен теми, к которым можно прикрутить MongoDB без бубна и потери значительной части функциональности..
Большое спасибо всем, кто откликнется!
Офлайн
В теории подключать блоки через include под условием не должно быть сильно громоздко, например блоки передавать списком в шаблонизаторе цикл по блокам и “вызов” нужного include.
Так же есть вариант отправлять страницу с основным контентом, а доп блоки подгружать через ajax.
А вообще вставлять html блоки в шаблон - иногда нормально, и это можно по разному реализовать, можно для этого расширить шаблонизатор.
Все зависит от нюансов.
Главное тут не делать сильно универсальное решение, а делать под задачу. А то у меня есть опыт компонентной системы с наследованием в html - тупиковый путь.
PS: какой фреймворк, шаблонизатор используете?
Офлайн
Вот include с условием меня и пугает. Получается, что главный шаблон запрашивает у приложения данные о том, какой блок следующий и исходя из них делает include нужного блока.
Если уж все равно запрашивать данные - то не все ли равно, что возвращать - наименование блока или уже отрендеренный html? Зато при расширении приложения новым типом блоков, не нужно будет править основной шаблон. Т.е. не хочется размазывать этот функционал по всему приложению, а включать его только в одном месте.
Решение с AJAX не совсем честное. Т.к. по сути, мы все равно будет рендерить блоки по отдельности, только вместо шаблонизатора их будет собирать JS на клиенте. В остальном - разницы никакой.
Как я уже писал, с фреймворком и шаблонизатором не определились, у меня есть опыт работы с Django, но он не подходит по некоторым требованиям. Сейчас читаю доки по Pylons, пока не понимаю, подойдет ли он.
Понимаю, что есть опасность замахнуться на сверхуниверсальное решение и увязнуть. С другой стороны, хочется запустить приложение в работу с минимальным функционалом, а потом довешивать необходимое без переписывания основного кода. Нужно найти некий баланс и это непросто..
Офлайн
А чем не нравится такой вариант - контролер отдает в шаблон список инициализированных блоков, а шаблон просто вызывает для каждого блока из списка render. Каждый блок имеет собственный шаблон. По такому принципу работают формы в Django, ToscaWidgets, да много где еще.
Офлайн
Некоторое время назад я понял, что эта проблема больше не существует, так как есть AngularJS, решающий все эти проблемы. Обычный шаблонизатор вообще не нужен в принципе.
P.S. Pylons? Pyramid!
Офлайн
PooHНу это тот же “html” только с сахаром.
А чем не нравится такой вариант - контролер отдает в шаблон список инициализированных блоков, а шаблон просто вызывает для каждого блока из списка render. Каждый блок имеет собственный шаблон. По такому принципу работают формы в Django, ToscaWidgets, да много где еще.
ZZZВы про шаблонизацию на клиенте? (просто его вроде есть попытки применения его на сервере 8)
Некоторое время назад я понял, что эта проблема больше не существует, так как есть AngularJS, решающий все эти проблемы. Обычный шаблонизатор вообще не нужен в принципе.
Офлайн
ZZZДля сайтов все же лучше генерировать данные на сервере с помощью шаблонизаторов - поисковики не любят сайты, сделанные как web-приложения.
Некоторое время назад я понял, что эта проблема больше не существует, так как есть AngularJS, решающий все эти проблемы. Обычный шаблонизатор вообще не нужен в принципе.
ZZZ+1 за Пирамиду.
P.S. Pylons? Pyramid!
Офлайн
o7412369815963Тут есть один нюанс :D В этом случае логика остается в контролере, разметка остается в шаблонах
Ну это тот же “html” только с сахаром.
Офлайн
PooHЯ согласен что это лучше, я это и имел в виду когда писал “можно для этого расширить шаблонизатор.”
Тут есть один нюанс :D В этом случае логика остается в контролере, разметка остается в шаблонах
{% render(block) %}
Офлайн
Хотелось бы про чудеса с AngularJS послушать
Офлайн