Хотя в большинстве случаев я бы рекомендовал то, что вы изначально заявили, используя Javascript для загрузки каждого виджета, так как это не вариант, я думаю, вам нужно будет сделать что-то немного другое.
Помимо использования подхода, состоящего в попытке заставить один фронт-контроллер пройти через все необходимые виджеты и построить их, альтернативой, которую вы, возможно, захотите рассмотреть, является более мощное использование шаблонов в Mako.
На самом деле вы можете определить небольшие блоки как Mako def, которые, конечно, имеют полную мощность Python. Чтобы избежать загрязнения шаблонов Mako доменной логикой, не забудьте сохранить все это в своих моделях и просто вызывать экземпляры модели в определениях Mako по мере необходимости, чтобы этот компонент страницы создавался сам.
Огромным преимуществом этого подхода является то, что, поскольку Mako def поддерживает аргументы кеша, вы фактически можете сделать так, чтобы компоненты страницы сами решали, как кешировать себя. Возможно, боковая панель должна быть кэширована в течение 5 минут, но верхняя панель, например, меняет каждый удар. Кроме того, поскольку компонент запускает попадание в базу данных, вы сохраняете попадания в базу данных, когда компонент кэшируется сам.
ToscaWidgets не обладает такой производительностью, чтобы сделать его очень выполнимым вариантом в более широком масштабе, поэтому я бы держался подальше от этого.
Что касается некоторых изменений в вашей существующей идее, убедитесь, что вы на самом деле не используете контроллеры Pylons для «виджетов», так как они делают гораздо больше для поддержки WSGI, который вам не нужен для создания страницы виджетов.
Я бы подумал, чтобы все классы Widget работали так:
class Widget(object):
def process(self):
# Determine if this widget should process a POST aimed at it
# ie, one of the POST args is a widget id indicating the widget
# to handle the POST
def prepare(self):
# Load data from the database if needed in prep for the render
def render(self):
# return the rendered content
def __call__(self):
self.process()
self.prepare()
return self.render()
Тогда просто сделайте так, чтобы ваш основной шаблон Mako перебирал экземпляры виджетов, и вызывайте их для их вывода.