Одно представление (frontpage) для многих контроллеров (вложенные представления)

StackOverflow https://stackoverflow.com/questions/574140

Вопрос

Примечания: Не может использовать Javascript или iframes.На самом деле я не могу доверять клиентскому браузеру практически ничего, кроме ultra basics.

Я перестраиваю устаревшее приложение PHP4 в MVC-приложение, и большая часть моих исследований в настоящее время сосредоточена на платформе Pylon.

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

Лучший способ визуализировать мою проблему - это заглянуть на персонализированную домашнюю страницу Google.Они решают проблему с помощью Javascript, но для моего сценария javascript и практически все, что выше базового XHTML, невозможно.

Одна идея, над которой я начал работать, заключалась в том, чтобы мой контроллер Frontpage опрашивал базу данных или другой сервис для текущих активированных виджетов, затем брал список кортежей / dicts, динамически создавал экземпляр каждого контроллера и создавал список / dict вложенных представлений рендеринга и передавал это в представление frontpage и позволял ему разобраться.

Так и с кодом peusudo:

Get request goes to WSGI
WSGI calls pylons
Pylons routes to Frontpage.index()
Frontpage.index() 
   myViews = list()
   for WidgetController in ActiveWidegets():
        myViews.append(subRender(WidgetController, widgetView))

c.subviews = myViews
render(frontpage.mako)

Странные моменты о Субрендере

  • Динамически импортирует контроллеры через __import__ (в настоящее время жестко закодировано для пространства имен проекта :( )
  • Потенциально может быть очень дорогим (большинство вызовов виджетов могут быть кэшированы, но одним из них является панель пользователя).

Я чувствую, что для этого должен быть лучший способ или, возможно, механизм, уже реализованный в WSGI или, еще лучше, в Pylons, но пока что самый близкий, который я нашел, - это этот служебный метод: http://www.pylonshq.com/docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forward но это кажется немного безумным - строить N экземпляры пилонов поверх пилонов просто для получения представлений коллекции.

Это было полезно?

Решение

Хотя в большинстве случаев я бы рекомендовал то, что вы изначально указали, используя Javascript для загрузки каждого виджета, поскольку это не вариант, я думаю, вам нужно будет сделать что-то немного другое.

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

На самом деле вы можете определить небольшие блоки как Mako def, которые, конечно же, обладают полной мощью Python.Чтобы избежать загрязнения ваших шаблонов Mako логикой домена, убедитесь, что все это сохранено в ваших моделях, и просто выполняйте вызовы экземпляров модели в Mako def по мере необходимости, чтобы этот компонент страницы мог сам себя создать.

Огромным преимуществом этого подхода является то, что, поскольку Mako def поддерживает аргументы кэша, вы можете фактически предоставить компонентам страницы самим решать, как кэшировать.Возможно, боковую панель следует кэшировать в течение 5 минут, но, например, верхняя панель меняется при каждом нажатии.Кроме того, поскольку компонент запускает обращение к базе данных, вы будете сохранять обращения к базе данных, когда компонент кэширует сам себя.

ToscaWidgets не обладает достаточной производительностью, чтобы сделать это вполне осуществимым вариантом в более крупном масштабе, поэтому я бы воздержался от подобных попыток.

Что касается некоторых настроек вашей существующей идеи, убедитесь, что на самом деле не используете контроллеры Pylons для "виджетов", поскольку они делают гораздо больше, чем необходимо для поддержки WSGI, что вам не нужно для создания страницы с виджетами.

Я бы подумал о том, чтобы все классы виджетов работали следующим образом:

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 выполнить итерацию по экземплярам виджета и вызвать их для рендеринга.

Другие советы

Вы могли бы использовать ТоскаВиджеты чтобы инкапсулировать ваши виджеты вместе с сохраненным списком виджетов, включенных для каждого пользователя (в базе данных или другом сервисе, как вы предлагаете).Передайте список включенных ToscaWidgets в представление, и виджеты будут отображаться сами (включая динамическое добавление ссылок CSS / JavaScript на страницу, если виджету требуются эти ресурсы).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top