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

1

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

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

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

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

Одна из идей, над которой я начал работать, заключалась в том, чтобы мой контролер 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)

Странные биты о subRender

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

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

  • 0
    @S. Большое спасибо, не осознавал, что это плохо отразилось, когда я впервые подал заявку.
Теги:
model-view-controller
cherrypy
pylons

2 ответа

6
Лучший ответ

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

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

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

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

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()

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

0

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

  • 0
    @Chris - я начал изучать Tosca недавно, у меня сложилось впечатление, что это скорее инструмент для построения форм, или я ошибаюсь?
  • 0
    @David - нет, он не является специфичным для формы, хотя он предоставляет множество виджетов на основе форм в tw.forms. Сам по себе TW - библиотека инкапсуляции «виджетов», которая может обернуть любой повторно используемый компонент пользовательского интерфейса. Документы, возможно, не делают это очевидным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню